相关疑难解决方法(0)

我如何制作一个不会被优化掉的无限空循环?

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");
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这会打印出begin,然后在非法指令ud2放置在 之后的陷阱die()上崩溃在 Godbolt 上,我们可以看到调用puts.

让 Clang 输出无限循环是一项非常困难的任务-O2- 虽然我可以反复测试一个volatile变量,但这涉及到我不想要的内存读取。如果我做这样的事情:

#include <stdio.h>

static void die() {
    while(1)
        ;
}

int main() {
    printf("begin\n");
    volatile int x …
Run Code Online (Sandbox Code Playgroud)

c clang compiler-optimization language-lawyer

141
推荐指数
6
解决办法
3万
查看次数

标签 统计

c ×1

clang ×1

compiler-optimization ×1

language-lawyer ×1