20

我想知道为什么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, -pedanticand -ansi(正如这里讨论的那样)。然而,这些都没有给我一个警告。

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

我认为 gcc 选项-Wall -Werror应该会引发错误。

4

2 回答 2

26

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

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

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

伊恩

于 2014-01-20T17:24:09.357 回答
0

gcc 有几十个通行证——看他们尝试用开关编译

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

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

于 2013-08-14T22:31:58.557 回答