[英]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.