UBSAN报道:-875 << 7为未定义的行为

Jac*_*cko 2 c bit-manipulation undefined-behavior ubsan

简单的代码片段:

#define FOO 7
int bar = -875;
bar <<= FOO;
Run Code Online (Sandbox Code Playgroud)

这被UBSAN报告为UB.

我的理解是,这-875 << 7是公正的-(875<<7) ,没有溢出.

那么,这里有一个真正的问题吗?

AnT*_*AnT 7

你的理解是不正确的.

首先你使用了bar <<= FOO语法.这明确地转移bar并且bar是否定的.负值的左移会在C中产生未定义的行为.没有办法bar <<= FOO可以解释为-(875<<7).

其次,关于-875 << 7运营商优先级:一元运算符总是具有比二元运算符更高的优先级,这意味着-875 << 7(-875) << 7和否-(875 << 7).而且,负值的左移也会在C中产生不确定的行为.