为什么 clang sanitizer 认为无符号数的左移是未定义的?

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)