13
如何制作不会被优化的无限空循环?
C11标准似乎暗示不应优化具有恒定控制表达式的迭代语句。我从这个答案中获取建议,该答案特别引用了标准草案的6.8.5节: 该实现可以假定其控制表达式不是常量表达式...的迭代语句终止。 在该答案中,它提到while(1) ;不应对循环进行优化。 那么...为什么Clang / LLVM优化了下面的循环(与编译cc -O2 -std=c11 test.c -o test)? #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); die(); printf("unreachable\n"); } 在我的机器上,此打印输出begin,然后在一条非法指令(ud2位于后面的陷阱die())中崩溃。在godbolt上,我们可以看到调用之后什么也没有产生puts。 让Clang在下面输出无限循环是一件非常困难的任务-O2-虽然我可以重复测试一个volatile变量,但该变量涉及不需要的内存读取。如果我做这样的事情: #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); volatile int x = 1; if(x) die(); …