当将负文字作为无符号参数传递时,可以g++警告
Can g++ warn when passing a negative literal as an unsigned parameter?
考虑:
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
对此发出警告,但这会警告从int
到unsigned
的每次转换,而且很快就太烦人了(例如,每次用int
、vec[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也是个好主意)。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数向量_指针有不同的原型,我可以构建一个吗
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 在Linux中哪里可以找到互斥、未来等的源代码
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 与互斥锁相比,旋转锁可以保证上下文切换
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 是否可以通过C++扩展强制多个python进程共享同一内存
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 我们可以访问一个不存在的联盟的成员吗
- 导入库可以跨dll版本工作吗
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 是否可以从int转换为enum类类型
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗