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.无论优化级别如何,都应该发出警告.