为什么GCC不为无法访问的代码发出警告?

为什么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; } }

我想知道为什么在这个例子中,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;   
    }     
}

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,如果编译器警告…如果有人好奇,请提交,这是可以避免的。