为什么GCC没有警告无法访问的代码?

时间:2013-06-22 10:54:48

标签: 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;   
    }     
}

int main(int argc, const char *argv[])
{
    printf("first call %d\n", status());
    printf("second call %d\n", status());
    return 0;
}

注意,错误的status()功能的目的是保持状态。我曾期望通过-Wall收到警告。我还尝试了-Wunreachable-code-Wextra-pedantic-ansi(正如我们所讨论的那样here)。然而,这些都没有给我一个警告。

看来gcc会默默地删除静态变量赋值。

在我看来,gcc options -Wall -Werror应该抛出错误。

2 个答案:

答案 0 :(得分:20)

gcc 4.4会给你警告。在gcc的更高版本中,此功能(Wunreachable-code)已被删除。

见这里: http://gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html

  

-Wunreachable-code已被移除,因为它不稳定:它   依赖于优化器,因此不同版本的gcc会发出警告   关于不同的代码。编译器仍然接受并忽略   命令行选项,以便现有的Makefile不会被破坏。在   未来一些版本将完全删除该选项。

     

伊恩

答案 1 :(得分:0)

gcc有几十次传递 - 看到他们尝试使用像

这样的开关进行编译

-da -dAp -Wa,-a -fdump-ipa-all-all -fdump-tree-all-all -fdump-rtl-all-all

我的猜测是,在指定发出相关警告的传递之前,某些传递已经完成了死代码消除。这可能被合理地视为一个错误,但gcc团队可能更多地将警告视为一种便利而不是道德承诺,并且没有动力做大量的工作来使其精确和完整。如果您想要贡献,您可以逐个禁用优化传递,直到找到阻止警告的优化传递,然后提交记录问题的错误报告。如果这不值得你的时间,也许修复它是不值得他们的时间。 : - )