考虑:
unsigned foo(unsigned u) {
return u;
}
int main() {
foo(-1);
return 0;
}
这里调用函数foo
,u
等于4294967295(或类似的大值。)如果程序员没有注意,这可能是非常意外的。
例如,您可能正在实施pow
以将Polynomial类提升为幂。由于只有正面的权力,你决定签名
Polynomial pow(const Polynomial& p, unsigned exp);
然后一个粗心的程序员调用pow(p, -1)
得到一个反向,而不是一个警告或错误,它似乎工作,但可能使用了极大的内存和时间来产生一个完全错误的答案。
g ++ 5.3.0和gcc 5.3.0,在没有-Wall -Wextra
投诉的情况下进行编译。
他们会使用-Wsign-conversion
选项警告它,但是这会警告从int
到unsigned
的每次转换,并且很快就会烦人(它警告说)例如,每次使用int
,vec[i]
索引矢量时。)
gcc是否可以警告将负文字或其他负编译时常量作为无符号参数传递?
答案 0 :(得分:0)
-Wconversion将警告您所传递的参数中的隐式转换。如果要将警告视为错误,请添加-Werror。
这是我的测试及其结果。
源代码文件temp.c:
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)。