Досліджуючи сумнівну претензію , я написав цю маленьку тестову програму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
Ват.
Якщо я компілюю без оптимізацій, він висить, як очікувалося. Я подивився на збірку, і без усіх дзвіночків 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
int n = 0
===> unsigned int n = 0;
або ще краще ..while (1);
unsigned int