asa*_*n74 5 c clang compiler-warnings
如果我使用clang编译以下简单程序(test.c)
#include <stdio.h>
typedef enum {
a,
b
} sample_enum_t;
int main() {
sample_enum_t sample_enum = -1;
if (sample_enum == -1) {
printf("Equals\n");
}
}
Run Code Online (Sandbox Code Playgroud)
编译给我警告:
$ clang -o test test.c
test.c:11:21: warning: comparison of constant -1 with expression of type 'sample_enum_t' is always false [-Wtautological-constant-out-of-range-compare]
if (sample_enum == -1) {
~~~~~~~~~~~ ^ ~~
1 warning generated.
Run Code Online (Sandbox Code Playgroud)
比较不总是错误的,这显然是不正确的,如果我执行程序,它将以“等于”打印:
$ ./test
Equals
Run Code Online (Sandbox Code Playgroud)
是叮当声还是我遗漏了一些东西?我确实知道,将-1分配给sample_enum变量不是一个好主意,但这是有效的行,因此clang不会因为该行而向我发出警告。
我正在使用clang 3.5.2
暂时先不管 Clang 是对还是错,让我们看看标准是怎么说的。
每个枚举类型应与 char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,128),但应能够表示枚举所有成员的值。枚举类型直到紧接终止枚举器声明列表的 } 之后才完整,并在此后完成。
128) 实现可能会延迟选择哪种整数类型,直到看到所有枚举常量。
您依赖于实现定义的行为;-1标准没有定义您的实现选择的类型是否可以表示。Clang 和 GCC 都使用unsigned int(在我使用 gcc 7.0.1 和 clang 3.8.0 对代码进行测试时)。因此,您的代码是有效的,因为代表 -1 没有问题。
因此,这不是一个真正的问题,并且 Clang 的诊断在某种程度上有用,因为如果您无意中使用了您定义的枚举常量范围之外的某些值。