En enquêtant sur une affirmation douteuse , j'ai écrit ce petit programme de testnoway.c
int proveit()
{
unsigned int n = 0;
while (1) n++;
return 0;
}
int main()
{
proveit();
return 0;
}
En testant cela, je reçois:
$ clang -O noway.c
$ ./a.out
zsh: illegal hardware instruction ./a.out
Wat.
Si je compile sans optimisations, il se bloque comme prévu. J'ai regardé l'assemblage, et sans toutes les cloches et les sifflets, la main
fonction ressemble à ceci:
_main: ## @main
pushq %rbp
movq %rsp, %rbp
ud2
Où ud2
est apparemment se trouve une instruction spécifique pour un comportement non défini. La revendication douteuse susmentionnée, "Une fonction qui ne revient jamais est UB", est renforcée. J'ai quand même du mal à y croire. Vraiment!? Vous ne pouvez pas écrire une boucle de rotation en toute sécurité?
Je suppose donc que mes questions sont les suivantes:
- Est-ce une lecture correcte de ce qui se passe?
- Si oui, quelqu'un peut-il m'indiquer une ressource officielle qui le vérifie?
- Dans quelle situation souhaiteriez-vous que ce type d'optimisation se produise?
Informations pertinentes
$ 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;
ou mieux encore ..while (1);
unsigned int