将负面文字作为无符号参数传递时,g ++会发出警告吗?

时间:2016-04-29 15:21:20

标签: c++ c gcc g++ compiler-warnings

考虑:

unsigned foo(unsigned u) {
    return u;
}

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

这里调用函数foou等于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选项警告它,但是这会警告intunsigned的每次转换,并且很快就会烦人(它警告说)例如,每次使用intvec[i]索引矢量时。)

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

1 个答案:

答案 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)。