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)
,没有溢出.
那么,这里有一个真正的问题吗?
你的理解是不正确的.
首先你使用了bar <<= FOO语法.这明确地转移bar并且bar是否定的.负值的左移会在C中产生未定义的行为.没有办法bar <<= FOO可以解释为-(875<<7).
其次,关于-875 << 7运营商优先级:一元运算符总是具有比二元运算符更高的优先级,这意味着-875 << 7是(-875) << 7和否-(875 << 7).而且,负值的左移也会在C中产生不确定的行为.