当将负文字作为无符号参数传递时,可以g++警告

Can g++ warn when passing a negative literal as an unsigned parameter?

本文关键字:可以 g++ 警告 参数传递 无符号 文字      更新时间:2023-10-16

考虑:

unsigned foo(unsigned u) {
    return u;
}
int main() {
    foo(-1);
    return 0;
}

在这里,函数foo是在u等于4294967295(或类似的大值)的情况下调用的。如果程序员没有注意,这可能会非常出乎意料。

例如,您可能正在实现pow以将多项式类提升到幂。由于只有正幂是可能的,您可以决定签名

Polynomial pow(const Polynomial& p, unsigned exp);

然后,一个粗心的程序员调用pow(p, -1)来获得一个相反的结果,而不是一个警告或错误,它看起来是有效的,但可能会使用大量的内存和时间来产生一个完全错误的答案。

g++5.3.0和gcc 5.3.0,在不抱怨-Wall -Wextra的情况下编译。

他们会用选项-Wsign-conversion对此发出警告,但这会警告从intunsigned的每次转换,而且很快就太烦人了(例如,每次用intvec[i]索引到向量时,它都会发出警告。)

gcc是否可以警告将负文字或其他负编译时常数作为无符号参数传递?

-Wconversion将警告您传递的参数中存在隐式转换。如果您想将警告视为错误,请添加-Werror。

这是我的测试结果。

临时源代码文件:

unsigned foo(unsigned u) {
    return u;
}
int main() {
  foo(-1);
}

以及汇编,

$ gcc -o temp temp.c -Wconversion
temp.c: In function ‘main’:
temp.c:6:7: warning: negative integer implicitly converted to unsigned type [-Wsign-conversion]
   foo(-1);
       ^

如果将参数更改为1,然后再次编译,则警告将消失。

(除此之外,始终使用-Wall也是个好主意)。