简单的代码段:

#define FOO 7
int bar = -875;
bar <<= FOO;


UBSAN将其报告为UB。

我的理解是-875 << 7只是-(875<<7)
而且没有溢出。

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

最佳答案

您的理解不正确。

首先,您使用了bar <<= FOO语法。这将显式移动barbar为负。负值向左移动会在C语言中产生未定义的行为。bar <<= FOO不能解释为-(875<<7)

其次,关于-875 << 7的运算符优先级:一元运算符的优先级始终高于二进制运算符,这意味着-875 << 7(-875) << 7而不是-(875 << 7)。同样,负值向左移动会在C语言中产生不确定的行为。

关于c - UBSAN报告:-875 << 7为未定义行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36751538/

10-11 04:51