关于GCC的-Wsign-conversion选项未检测枚举类型符号性的问题咨询
关于GCC的-Wsign-conversion选项未检测枚举类型符号性的问题咨询
我最近碰到了一个GCC警告相关的疑惑,想跟大家请教讨论下。先看这段存在明显bug的代码:
#include <stdio.h> enum A { a1, a2 }; int foo() { return -1; } int main() { enum A a = foo(); if (a < 0) printf("neg\n"); else printf("pos\n"); }
这段代码的问题很直接:把返回-1的int值赋值给enum A类型变量a后,a < 0的判断永远会返回false。原因是这个枚举的常量都是非负值,编译器会为它选择无符号的底层整数类型,-1会被转成一个极大的无符号数值,自然不可能小于0。
有意思的是Clang能轻松检测到这个问题,开启-Wconversion(或者更精准的-Wsign-conversion)选项时,会给出明确的符号转换警告:
$ clang -Wconversion enum1.c enum1.c:7:13: warning: implicit conversion changes signedness: 'int' to 'enum A' [-Wsign-conversion] enum A a = foo(); ^~~~~ 1 warning generated.
但我把GCC的相关警告选项试了个遍,包括-Wconversion、-Wsign-conversion、-Wenum-conversion,甚至加上-Wall -Wextra兜底,再配合-Werror强制警告转错误,GCC都完全没察觉到这个问题,编译直接通过:
$ gcc -Wconversion -Werror enum1.c; echo $? 0 $ gcc -Wall -Wextra -Wsign-conversion -Wenum-conversion -Werror enum1.c; echo $? 0
我使用的GCC版本是Ubuntu发行版的13.3.0:
$ gcc --version gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 Copyright (C) 2023 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的已知设计限制吗?还是我漏掉了某个特定的警告选项,能让GCC检测到这种枚举类型的符号转换风险?
内容来源于stack exchange
相关产品推荐
相关产品推荐

