clang tutological-constant-out-of-range-compare warning

时间:2017-02-20 12:21:11

标签: c clang compiler-warnings

如果我使用clang

编译以下简单程序(test.c)
margin: auto

汇编给了我一个警告:

#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");
    }
}

如果我执行以“Equals”打印的程序,那么比较总是错误,这显然不是真的:

$ 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.

这是一个铿锵的错误还是我错过了什么?我明白将-1分配给sample_enum变量并不是一个好主意,但它是一个有效的行,并且clang不会因为该行而给我一个警告。

我正在使用clang 3.5.2

1 个答案:

答案 0 :(得分:1)

暂时忽略Clang是对还是错,让我们看一下标准所说的内容。

6.7.2.2 Enumeration specifiers

  

每个枚举类型应与char,有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,128)但是应该能够表示枚举的所有成员的值。枚举类型直到完成枚举器声明列表的}之后才会完整,然后完成。

     

128)实现可能会延迟选择哪个整数类型,直到看到所有枚举常量。

您依赖于实现定义的行为;您的实现选择的类型是否可以表示-1不是由标准定义的。 Clang和GCC都使用unsigned int(在我使用gcc 7.0.1和clang 3.8.0测试你的代码时)。所以,你的代码是有效的,因为没有代表-1的问题。

所以,这不是一个真正的问题,而且Clang的诊断有点用处,因为如果你无意中使用了一些你定义的枚举常量范围之外的值。