繁体   English   中英

是否有一个 g++ 标志可以在 switch 语句中检测并警告此无法访问的代码?

[英]Is there a g++ flag that can detect and warn about this unreachable code in a switch statement?

不是最小可能的复制,但希望在一口大小的同时很好地说明问题。

#include <iostream>

int main(int, char **)
{
  int i;
  std::cin >> i;

  switch(i)
  {
      case 0:

        break;
        std::cout << "too small" << std::endl;

      case 1:
        break;
    
      default:
        std::cout << "too large" << std::endl;
        break;
  }

  return 0;
}

当然,这里的问题是用户在 break之后而不是之前向 switch 语句添加了代码。 (当然,在一个真实的例子中,在 break 语句之前会有预先存在的代码)

clang 能够使用-Wunreachable-code标志检测到这一点,而 MSVC 能够通过/Wall检测到它,但我还没有找到让 g++ 对此发出警告的方法。

g++确实有一个标志-Wswitch-unreachable ,但它只捕获出现在第一个开关 label 之前的代码,所以它在这里没有帮助。

这在 Eljay 和 Jerry Jeremiah 的评论中基本上得到了解决,但为了关闭问题,看起来 gcc 在 2014 年默默地删除了无法访问的代码检测,因为它在不同的优化级别给出了不同的结果。

这似乎是一个非常愚蠢的理由,用于删除每个编译器应该具有的最基本和最重要的功能之一,但我知道什么?

来自 gcc 邮件列表:

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

资料来源: https://gcc.gnu.org/legacy-ml/gcc-help/2011-05/msg00360.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM