即使启用了Wextra选项,gcc在比较无符号整数<0时也不会发出警告。

3
请看以下代码:
#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编译时没有任何关于无意义比较的提示。然而,clang友好地警告了我们:

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

这是为什么呢(我猜模板是问题的根源),在这种情况下是否可以强制gcc 输出警告?


1
听起来像是一个 bug。通常 gcc 会实现这个警告,就像 https://dev59.com/xVDTa4cB1Zd3GeqPGh8M 中所展示的那样。 - Barmar
4
通常情况下,gcc可以使用-Wconversion选项来捕捉这些类型的问题,但似乎在模板中会出现问题...这看起来像是一个bug,请提交一个bug报告。 - Shafik Yaghmour
是的,它在更简单的例子上可以工作,我只是想检查一下是否有涉及模板的技巧,然后再提交一个愚蠢的错误报告。谢谢! - jureslak
3
已提交bug82924报告。 - jureslak
1个回答

1
这是一些GCC版本中的回归错误(包括8.x和9.x等许多发行版默认编译器在撰写时仍然如此)。
该错误已经被追踪这里(@jureslak再次提交,但被标记为重复),并已得到解决。使用GCC 10.1看到警告(Godbolt)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接