Mentre indaga su un'affermazione dubbia , ho scritto questo piccolo programma di testnoway.c
int proveit()
{
unsigned int n = 0;
while (1) n++;
return 0;
}
int main()
{
proveit();
return 0;
}
Provando questo, ottengo:
$ clang -O noway.c
$ ./a.out
zsh: illegal hardware instruction ./a.out
Wat.
Se compilo senza ottimizzazioni, si blocca come previsto. Ho guardato l'assemblea, e senza tutte le campane e fischietti la main
funzione è simile a questa:
_main: ## @main
pushq %rbp
movq %rsp, %rbp
ud2
Dov'è ud2
apparentemente è un'istruzione specifica per un comportamento indefinito. La summenzionata affermazione dubbia, "Una funzione che non ritorna mai è UB", è rafforzata. Trovo comunque difficile crederci. Veramente!? Non riesci a scrivere in modo sicuro uno spin loop?
Quindi immagino che le mie domande siano:
- È una lettura corretta di ciò che sta succedendo?
- In tal caso, qualcuno può indicarmi una risorsa ufficiale che lo verifica?
- Qual è una situazione in cui vorresti che si verifichi questo tipo di ottimizzazione?
Informazioni rilevanti
$ 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;
o meglio ancora ..while (1);
unsigned int