在调查a dubious claim时,我编写了这个小型测试程序noway.c
int proveit()
{
unsigned int n = 0;
while (1) n++;
return 0;
}
int main()
{
proveit();
return 0;
}
对此进行测试,我得到:
$ clang -O noway.c
$ ./a.out
zsh: illegal hardware instruction ./a.out
Wat。
如果我不进行优化就进行编译,则它会按预期挂起。我看了看一下程序集,没有所有的花哨功能,main
函数看起来像这样:
_main: ## @main
pushq %rbp
movq %rsp,%rbp
ud2
ud2
显然是专门针对未定义行为的指令。前面提到的可疑声明“永不返回的函数是UB”得到了增强。我仍然很难相信。真!?您不能安全地编写自旋循环吗?
所以我想我的问题是:
- 这是对正在发生的事情的正确理解吗?
- 如果是这样,有人可以指出我的官方资源吗?
- 在什么情况下您希望发生这种类型的优化?
相关信息
$ clang --version
Apple clang version 11.0.0 (clang-1100.0.20.17)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin