【发布时间】:2020-06-16 00:00:04
【问题描述】:
我正在分析代码库中的一些警告,但对 Clang 生成的这个警告感到困惑
考虑以下 C++ 代码:
#include <iostream>
int main(int , char *[])
{
uint32_t val1 = 10;
int32_t val2 = -20;
int32_t result = val1 + val2;
std::cout << "Result is " << result << "\n";
return 0;
}
使用-Wconversion 编译此代码时,Clang 给我以下警告
<source>:9:25: warning: implicit conversion changes signedness:
'unsigned int' to 'int32_t' (aka 'int') [-Wsign-conversion]
int32_t result = val1 + val2;
~~~~~~ ~~~~~^~~~~~
<source>:9:27: warning: implicit conversion changes signedness:
'int32_t' (aka 'int') to 'unsigned int' [-Wsign-conversion]
int32_t result = val1 + val2;
~ ^~~~
2 warnings generated.
GCC 也给了我这个警告,但是我需要提供 -Wsign-conversion 来触发它。
警告说val2 将被转换为unsigned int,因此会失去它的标志。到现在为止还挺好。但是我期待上面的代码会产生 incorrect 输出,令我惊讶的是它工作得非常好。
Result is -10
查看在两个编译器上运行的程序on godbolt。
在编译后的代码中不会发生强制转换,val2 保持其原始值。计算结果是正确的。此警告警告我要注意的实际危险是什么?我怎样才能触发这种行为?警告是假的吗?
【问题讨论】:
-
如果您想象(例如)对数组访问进行边界检查,您需要非常小心有符号 无符号转换以避免安全漏洞。这(非常)远非假设。因此,明确说明此类转换可以说是一种很好的风格,即使结果是您在您遇到的每台机器上所期望的结果。
标签: c++ clang compiler-warnings implicit-conversion unsigned-integer