为啥 GCC 不对无法访问的代码发出警告?

Posted

技术标签:

【中文标题】为啥 GCC 不对无法访问的代码发出警告?【英文标题】:Why does GCC not warn for unreachable code?为什么 GCC 不对无法访问的代码发出警告? 【发布时间】:2013-06-19 10:51:11 【问题描述】:

我想知道为什么 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 选项-Wall -Werror 应该会抛出一个错误。

【问题讨论】:

【参考方案1】:

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

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

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

伊恩

【讨论】:

我讨厌他们基于这样的原因删除功能。并且偷偷地做... “编译器仍然接受并忽略命令行选项” 所以在编译器更新后我们有一个错误,如果编译器发出警告,这是可以避免的... 如果有人好奇,请提交bc3c12a29c67753c473b465767b2ba6b2f7e72a6。【参考方案2】:

gcc 有几十个 pass —— 看看他们尝试使用类似开关进行编译

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

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

【讨论】:

以上是关于为啥 GCC 不对无法访问的代码发出警告?的主要内容,如果未能解决你的问题,请参考以下文章

为啥连续抛出 2 个异常不会产生无法访问的代码警告?

为啥 clang 无法展开循环(即 gcc 展开)?

代码中显然有一个无法访问的语句,但可以编译 - 为啥? [复制]

if .. else number 小于,无法访问的代码

当 if 条件为常量时,为啥未检测到无法访问的代码?

为啥有些文件拒绝访问