创死人的未定义行为(和气死人的编译器优化)

溢出时判断

溢出是未定义行为(即 UB),一般情况利用是没有问题的,但是在判断时会出现 bug,如以下代码:

int check(int x)
{
	return x + 1 > x;
}

\(x\) 不等于 \(inf\) 时这个函数的返回值始终为 \(1\),因为溢出是未定义行为,编译器会略过 \(x = inf\) 这时候编译器会帮我们优化,把这个函数直接优化成返回 \(1\),因此造成了错误。 目前发现这种情况仅出现在溢出时加法判断,理论上,只要是可以不考虑溢出直接优化的地方,都会出现这种错误。

-fwrapv 命令可以把溢出定义为回绕,从而避免了这种优化,解决 bug。

posted @ 2026-03-07 14:24  blind5883  阅读(2)  评论(0)    收藏  举报