Tag: 未定义行为有

在C / C ++中检测签名溢出

乍一看,这个问题可能看起来像是如何检测整数溢出重复? 但是它实际上是显着不同的。 我发现虽然检测到一个无符号的整数溢出非常微不足道,但是在C / C ++中检测一个有符号的溢出实际上比大多数人想象的要困难。 最明显而又天真的做法是这样的: int add(int lhs, int rhs) { int sum = lhs + rhs; if ((lhs >= 0 && sum < rhs) || (lhs < 0 && sum > rhs)) { /* an overflow has occurred */ abort(); } return sum; } 这个问题是根据C标准,有符号整数溢出是未定义的行为。 换句话说,根据这个标准,只要你甚至导致了一个签名溢出,你的程序就像你解引用一个空指针一样无效。 所以你不能导致未定义的行为,然后尝试检测事实后的溢出,就像在上面的post-condition检查的例子中一样。 即使上面的检查可能在许多编译器上工作,你也不能指望它。 事实上,因为C标准说未定义有符号整数溢出,所以有些编译器(比如GCC)会在优化标志被设置的时候优化掉上面的检查 ,因为编译器假定一个签名溢出是不可能的。 这完全打破了检查溢出的企图。 所以,另一种检查溢出的方法是: […]