gcc不会警告无法访问的代码

我想知道为什么gcc(4.6.3)没有给我这个例子中无法访问的代码的警告:

#include  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 (正如这里所讨论的那样)。 然而,这些都没有给我一个警告。

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

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

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

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

您的代码中没有错误。您使用return以使程序保持function状态并且未达到first_time = 0但是gcc没有错误,因为返回的目标是未达到代码的某些部分。 一个例子:

 int main(int argc, char **argv) { if (argc != 2) return (-1); //many code //many code //many code //many code //many code //many code //many code //many code //many code } 

所以在这个例子中,关键字return用于在条件不好时停止程序;)

gcc有几十个传递 – 看他们尝试用像开关一样编译

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

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