为什么GCC不为无法访问的代码发出警告?
我想知道为什么在这个例子中,gcc(4.6.3)没有对无法访问的代码给出警告:为什么GCC不为无法访问的代码发出警告?,c,gcc,static-variables,gcc-warning,C,Gcc,Static Variables,Gcc Warning,我想知道为什么在这个例子中,gcc(4.6.3)没有对无法访问的代码给出警告: #include <stdio.h> int status(void) { static int first_time = 1; if (first_time) { return 1; first_time = 0; /* never reached */ } else { return 0; } }
#include <stdio.h>
int status(void)
{
static int first_time = 1;
if (first_time) {
return 1;
first_time = 0; /* never reached */
} else {
return 0;
}
}
int main(int argc, const char *argv[])
{
printf("first call %d\n", status());
printf("second call %d\n", status());
return 0;
}
#包括
内部状态(无效)
{
静态int首次_时间=1;
如果(第一次){
返回1;
首次\u时间=0;/*从未到达*/
}否则{
返回0;
}
}
int main(int argc,const char*argv[]
{
printf(“第一次调用%d\n”,status());
printf(“第二次调用%d\n”,status());
返回0;
}
注意,故障status()
函数的目的是保持状态。我本以为会在-Wall
上得到警告。我还尝试了-Wunreachable code
,-Wextra
,-pedantic
和-ansi
(如前所述)。然而,这些都没有给我一个警告
gcc似乎会自动删除静态变量赋值
在我看来,gcc选项-Wall-Werror
应该会抛出一个错误。gcc有几十个过程——看看它们是否尝试使用如下开关编译
-da-dAp-Wa,-a-fdump ipa all-fdump tree all-fdump rtl all
我的猜测是,在指定发出相关警告的通行证之前,某些通行证已经进行了死代码消除。这可能会被合理地视为一个bug,但gcc团队可能会将警告更多地视为一种便利,而不是一种道德承诺,并且没有动机做大量工作以使其精确和完整。如果你想做出贡献,你可以一个接一个地禁用优化传递,直到你找到阻止警告的那个,然后提交一个bug报告来记录问题。如果这不值得你花时间,也许修复它不值得他们花时间。:-) GCC4.4将向您发出警告。在gcc的更高版本中,此功能(
-Wunreachable code
)已被删除
请看这里:
-Wunreachable代码
已被删除,因为它不稳定:它
依赖于优化器,因此不同版本的gcc会发出警告
关于不同的代码。编译器仍然接受并忽略
命令行选项,使现有的makefile不会被破坏。在里面
在未来的一些版本中,该选项将被完全删除
伊恩
我讨厌他们基于这样的原因删除功能。然后偷偷地做。。。“编译器仍然接受并忽略命令行选项”,因此,在编译器更新之后,我们出现了一个bug,如果编译器警告…如果有人好奇,请提交,这是可以避免的。