GCC 11 参数顺序触发误报 Wstringop-overflow,这是错误吗?
GCC 11 order of arguments triggers false positive Wstringop-overflow, is this bug?
最少的代码:
#include <stdio.h>
#include <stdint.h>
// gcc test.c
// gcc 11.2.1 20210816 [revision 056e324ce46a7924b5cf10f61010cf9dd2ca10e9]
// bug
// test.c:41:5: Warning: «test_bug» accessing 8 bytes in a region of size 4 [-Wstringop-overflow=]
typedef struct test_struct
{
int type;
const char *file; // removing this fix warning
int line; // removing this fix warning
} test_struct;
// warning only when ext_names is second argument
test_struct test_bug(uint32_t *queue_info_count, const char *ext_names[]){
test_struct retval = (test_struct){ .type = 0,};
printf("test_bug %s\n",ext_names[*queue_info_count]);
return retval;
}
// no warning
test_struct test_no_bug(const char *ext_names[], uint32_t *queue_info_count){
test_struct retval = (test_struct){ .type = 0,};
printf("test_no_bug %s\n",ext_names[*queue_info_count]);
return retval;
}
int main(void)
{
printf("Hello, world!\n");
uint32_t queue_info_count = 0;
const char *extension_names[] = {
"test",
};
test_bug(&queue_info_count, extension_names); // warning
test_no_bug(extension_names, &queue_info_count); // no warning
return 0;
}
使用 GCC 11 编译此代码总是在第 41 行显示警告 test_bug
。
Clang 和其他版本的 GCC 不显示任何警告。
这是一个错误吗?那么如何正确制作这段代码呢?谢谢
我得到这个警告的原始代码非常大,test_bug
函数在代码的许多部分使用了数百次,并且在逻辑中间只有一个警告。
这是一个 GCC 错误,但它已在主干版本中得到修复 https://gcc.godbolt.org/z/3s6haqvWP
最少的代码:
#include <stdio.h>
#include <stdint.h>
// gcc test.c
// gcc 11.2.1 20210816 [revision 056e324ce46a7924b5cf10f61010cf9dd2ca10e9]
// bug
// test.c:41:5: Warning: «test_bug» accessing 8 bytes in a region of size 4 [-Wstringop-overflow=]
typedef struct test_struct
{
int type;
const char *file; // removing this fix warning
int line; // removing this fix warning
} test_struct;
// warning only when ext_names is second argument
test_struct test_bug(uint32_t *queue_info_count, const char *ext_names[]){
test_struct retval = (test_struct){ .type = 0,};
printf("test_bug %s\n",ext_names[*queue_info_count]);
return retval;
}
// no warning
test_struct test_no_bug(const char *ext_names[], uint32_t *queue_info_count){
test_struct retval = (test_struct){ .type = 0,};
printf("test_no_bug %s\n",ext_names[*queue_info_count]);
return retval;
}
int main(void)
{
printf("Hello, world!\n");
uint32_t queue_info_count = 0;
const char *extension_names[] = {
"test",
};
test_bug(&queue_info_count, extension_names); // warning
test_no_bug(extension_names, &queue_info_count); // no warning
return 0;
}
使用 GCC 11 编译此代码总是在第 41 行显示警告 test_bug
。
Clang 和其他版本的 GCC 不显示任何警告。
这是一个错误吗?那么如何正确制作这段代码呢?谢谢
我得到这个警告的原始代码非常大,test_bug
函数在代码的许多部分使用了数百次,并且在逻辑中间只有一个警告。
这是一个 GCC 错误,但它已在主干版本中得到修复 https://gcc.godbolt.org/z/3s6haqvWP