【发布时间】:2016-04-04 15:28:28
【问题描述】:
考虑以下代码:
unsigned int n = 0;
unsigned int m = n - 1; // no warning here?
if (n > -1) {
std::cout << "n > -1.\n";
} else {
std::cout << "yes, 0 is not > -1.\n";
}
上面的代码在if 条件if (m > -1) 上产生一个警告,用于比较有符号和无符号整数表达式。我对此没有异议。困扰我的是前两个赋值语句。
unsigned int n = 0;
unsigned int m = n - 1;
我的想法是编译器应该在第二次赋值时给我一个警告,因为它知道变量n 是无符号的,第一行的值为0,并且试图从一个零值并将其分配给无符号类型。
如果第二次赋值后的下一行恰好与 if 语句或类似语句不同,则相关代码可能已通过。
是的,在分配给 m 之前有一个缩小转换,是的,编译器没有抱怨它,Marshall Clow 在他的 C++Now 2017 Lightning Talk (Fighting Compiler Warnings) 中也提到了这一点。
short s = 3 * 6;
short s = integer * integer;
short s = integer;
那么,为什么编译器不能告诉我该代码中可能存在的下溢?
编译器:
- Clang 3.7/4.0 (-Wall -Wextra)
- GCC 5.3/7.1.1 (-Wall -Wextra -pedantic)
- 微软 C/C++ 19.00.23506
【问题讨论】:
-
您希望得到什么警告?您在 if 语句中收到的警告是 有符号和无符号整数表达式之间的比较,这不是
unsigned int m = n - 1;中发生的情况 -
您是否尝试过使用 GCC 的
-Wall和-Wextra选项? -
@Plouff:是的,我已经将 -Wall -Wextra 与 GCC 一起使用。
标签: c++ gcc visual-c++ clang++