Dou*_*s B 4 c++ compiler-errors infinite-loop compiler-optimization undefined-behavior
我试图了解什么优化过程会导致以下代码在使用 -O3 优化标志编译时产生无限循环。为了解决这个问题,我知道问题的真正根本原因是这个非空函数中缺少返回,我在嵌入式系统上实现此代码的过程中发生了这种有趣的行为,并且没有但添加了返回值,因为当时我没有使用返回值。
我的问题更多是关于优化过程以及它正在做的事情在其他情况下如何提供帮助/“优化”逻辑是什么样的。
对于更多上下文,我在 ubuntu (c++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0) 中使用 c++ 编译器以及附带的 aarch64-linux-gnu-g++ 编译器时看到了这种行为Xilinx Vitis 2020.2(当然也可以在各自的平台上运行)。
最小可重现示例(我迄今为止创建的):
#include <iostream>
int broken_for_loop(){
for (int i = 0; i < 10000; i+= 1000){
std::cout << i << std::endl;
}
}
int main(int argc, char const *argv[]){
broken_for_loop();
}
Run Code Online (Sandbox Code Playgroud)
当使用c++ ./broken_loop_test.cpp -o test_local -O3ARM 或同等版本进行编译时。循环的输出是无限的,我已经运行它直到 32b int 结束。如果没有优化,它会按我的预期工作。如果我简单地return 0在 for 循环之后,它也适用于优化。
我天真的怀疑是,因为循环外部没有返回,编译器期望我从循环内部返回或突破,因此删除了测试循环条件的检查/分支,但我想知道我会做什么可以研究一下以获得有关这个特定主题的更多信息(以及一般的优化,自从我上一门编译器设计课程以来已经有一段时间了),而且我对 ASM 不太熟悉,无法自信地识别那里的问题。
任何帮助将不胜感激,谢谢!
因为本节是必需的,所以我会注意到我已经尝试声明volatile i和使用不同类型的整数以及转换常量值并在循环中执行更多/更少操作。没有 return 语句,所有这些都会导致相同的行为。
你的代码就是一个很好的例子。
循环后有未定义的行为(必须返回值的函数则不然)。由于允许编译器假设 UB 永远不会发生,因此它假设循环永远不会终止,并相应地对其进行编译。