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

And*_*aas 15 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;
}
Run Code Online (Sandbox Code Playgroud)

注意,故障status()功能的目的是保持状态.我曾期望得到一个警告-Wall.我也试过了-Wunreachable-code,-Wextra(-pedantic这里-ansi讨论的那样).然而,这些都没有给我一个警告.

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

在我看来,gcc选项-Wall -Werror应该抛出一个错误.

A. *_* K. 21

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

请参见:http: //gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html

-Wunreachable-code已被删除,因为它是不稳定的:它依赖于优化等不同版本的gcc会警告不同的代码.编译器仍然接受并忽略命令行选项,以便不破坏现有的Makefile.在将来的某个版本中,该选项将被完全删除.

伊恩

  • 我讨厌基于这样的原因删除功能.隐蔽地做它......*"编译器仍然接受并忽略命令行选项"*所以在编译器更新之后我们有一个bug,如果编译器已经发出警告就可以避免... (11认同)
  • 如果有人好奇,请提交 [bc3c12a29c67753c473b465767b2ba6b2f7e72a6](https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=bc3c12a29c67753c473b465767b2ba6b2f7e72a6)。 (2认同)

小智 1

gcc 有几十个遍——看看它们尝试使用像这样的开关进行编译

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

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