我需要编写一些检查程序,但它们似乎在使用-O0,-O1,-O2或-O3时表现不同。
下面我创建了一个最小的示例,对于-O0和-O1运行良好。但是使用-O2或-O3会改变行为。在-O0和-O1的情况下,for循环增加整数,第一次达到最大值时发生溢出,并触发检查程序。而在另一种情况下,虽然整数变成负数,但for循环永远不会停止。
代码
#include <iostream>
inline bool check(const int i) {
if (i < 0)
return false;
else
return true;
}
int main() {
for (int i = 0;; i += 50000000) {
std::cout << i << std::endl;
const bool succ = check(i);
if (succ == false) {
std::cout << "Overflow: " << i << std::endl;
break;
}
}
return 0;
}
编译器为什么可以将这个优化掉?
在尝试使用gcc、clang和icc之后,只有icc在所有的优化变体中都正确地执行了它,而其他两个则没有。
-fwrapv
来关闭g++的愚蠢行为,我想是这样的。 - Cheers and hth. - Alf