c - GCC 的 -Wmaybe-uninitialized 是否为基于枚举的 switch 语句生成带有 -O1 的虚假警告?

标签 c gcc enums compiler-warnings gcc6

我有一段如下形式的代码:

typedef enum {A=1,B} EnumType;

int foo (EnumType x)
{
  int r;
  switch (x) {
    case A:
      r = 1;
      break;
    case B:
      r = 2;
      break;
      /*
    default:
      r = -1;
      break;
      */
  }
  return r;
}

我使用 GCC 6.3.0 编译并收到警告:

$ gcc --version
gcc (MacPorts gcc6 6.3.0_2) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc -c -Wall -O1 test.c
test.c: In function 'foo':
test.c:20:10: warning: 'r' may be used uninitialized in this function [-Wmaybe-uninitialized]
   return r;
          ^

代码对我来说似乎是安全的,而且确实有一些关于 GCC producing false positives with this warning 的讨论.

这是虚假警告吗?

更多相关信息:

  • 添加注释掉的 default: block 解决警告
  • -O0 不会出现警告

最佳答案

这个警告是完全正确的,因为 enum 类型不限制可能的值到这个 enum 中定义的成员——它可以代替 基础整数类型的任何值。因此,如果您的 switch 中没有 default 分支,您确实可以使用未初始化的 r 和您显示的代码。

我可以使用问题中显示的确切代码重现 gcc-O0 缺少的警告,所以在我看来这就像是 gcc 中的错误。无论优化级别如何,都应发出警告。

关于c - GCC 的 -Wmaybe-uninitialized 是否为基于枚举的 switch 语句生成带有 -O1 的虚假警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45409452/

相关文章:

c - GCC 生成的程序集等同于 C 中的 continue 语句

arrays - 创建不同枚举的集合

swift - 需要了解ENUM以便在SpriteKit中进行联系

c - 找出数组中出现次数最多的数字

c - USB驱动编译错误

ios - 为基于 ARM 的设备优化 C 代码

c - 处理 "start without debugging"上的文件

c++ - 在 Ubuntu 13 的 64 位环境中构建 32 位 FCGI++ 二进制文件

c++ - 为什么这个 const 参数不能匹配非类型模板参数?

java - 将枚举方法链接到客户端类的成员变量