GCC的-Wyybe -ininitialized是否为基于枚举的switch语句生成-O1的虚假警告?

Pat*_*nan 2 c enums gcc 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;
}
Run Code Online (Sandbox Code Playgroud)

我用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;
          ^
Run Code Online (Sandbox Code Playgroud)

代码对我来说似乎是安全的,事实上有一些关于GCC的讨论会产生这种警告的误报.

这是一个虚假的警告吗?

更多相关信息:

  • 添加已注释的default:块可解决警告
  • 警告不会出现 -O0

小智 5

此警告完全正确,因为enum类型不会将可能的值限制为此中定义的成员enum- 它可以保留基础整数类型的任何值.因此,如果default您的交换机中没有分支,您确实可以使用r未初始化的代码显示.

我可以重现警告失踪gcc,并-O0在问题出确切的代码,所以这在我看来就像一个错误gcc.无论优化级别如何,都应该发出警告.

  • 这可能是一个错误.无论优化级别如何,"无效"的"枚举"值都是可能的. (4认同)
  • **没关系**.代码有可能为UB,警告应该警告这一点,**不**发出警告`-O0`是一个错误. (2认同)