即使启用了 Wextra,gcc 也不会给出将无符号整数< 0 进行比较的警告

gcc gives no warning for comparing unsigned integer < 0 even with Wextra enabled

本文关键字:lt 无符号整数 警告 比较 Wextra 启用 gcc      更新时间:2023-10-16

采用以下代码

#include <iostream>
template<typename T>
T f(T x, unsigned y) {
    if (y < 0) return x;
    return static_cast<T>(0);
}
using namespace std;
int main() {
    int a = f(2, 3);
    std::cout << a << std::endl;
    return 0;
}

其中函数f显然总是返回 0。用g++-7.2.0 -Wall -Wextra编译它并没有给出毫无意义的比较的暗示。然而,叮当很好地警告我们:

a.cpp:7:11: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
    if (y < 0) return x;
        ~ ^ ~
1 warning generated.

为什么会这样(我认为模板是问题的根源(,在这种情况下gcc可以强制输出警告吗?

这是某些版本的GCC中的一个回归错误(包括8.x和9.x - 在撰写本文时,它们仍然是许多发行版的默认编译器(。

该错误已在此处跟踪(@jureslak再次归档,但被标记为欺骗(并已解决。请参阅 GCC 10.1 (Godbolt( 的警告。