Ben*_*ker 4 c++ sanitizer undefined-behavior
我知道SO上有很多类似的问题。在称其为重复之前请仔细阅读。如果是的话,我很乐意获得相关问题的参考。
在我看来,clang 消毒程序正在抱怨无符号数字的完全有效的左移。
int main()
{
unsigned int x = 0x12345678;
x = x << 12;
return 15 & x;
}
Run Code Online (Sandbox Code Playgroud)
编译如下:
clang -fsanitize=undefined,integer shift-undefined.cpp -lubsan -lstdc++
结果出现此错误:
shift-undefined.cpp:4:11: runtime error: left shift of 305419896 by 12 places cannot be represented in type 'unsigned int'
我知道有些位会被遗忘,但我认为这对于无符号数字是合法的。是什么赋予了?
Ted*_*gmo 11
-fsanitize=address,integer
Run Code Online (Sandbox Code Playgroud)
清理程序integer也会检查无符号整数的“可疑”溢出,这些溢出不具有未定义的行为。
请参阅“ -fsanitize=unsigned-integer-overflow:无符号整数溢出,其中无符号整数计算的结果无法以其类型表示。与有符号整数溢出不同,这不是未定义的行为,但通常是无意的。此清理程序不会检查之前执行的有损隐式转换这样的计算(参见-fsanitize=implicit-conversion)。”
我会删除该选项并只关注有符号整数溢出:
-fsanitize=address,signed-integer-overflow
Run Code Online (Sandbox Code Playgroud)