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


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

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

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


12507
2018-06-22 10:54


起源



答案:


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

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


15
2018-01-20 17:24



我讨厌基于这样的原因删除功能。并暗中做它...... “编译器仍然接受并忽略命令行选项”  所以在编译器更新后我们有一个bug,如果编译器发出警告就可以避免... - Calmarius


答案:


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

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


15
2018-01-20 17:24



我讨厌基于这样的原因删除功能。并暗中做它...... “编译器仍然接受并忽略命令行选项”  所以在编译器更新后我们有一个bug,如果编译器发出警告就可以避免... - Calmarius


你的代码没有错误.. 你使用return来让程序离开函数状态并且没有达到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用于在条件不好时停止程序;)


0
2018-06-22 11:04



但是永远无法达到first_time = 0的赋值。 -wunreachable-code的目的是什么,如果它没有引发像这样的unachalbe代码的警告? - Andreas Haas
你的例子也不同。根据argc的值,可以访问“许多代码”。 - Andreas Haas


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

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

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


0
2017-08-14 22:31