Şüpheli bir iddiayı araştırırken , bu küçük test programını yazdımnoway.c
int proveit()
{
unsigned int n = 0;
while (1) n++;
return 0;
}
int main()
{
proveit();
return 0;
}
Bunu test, anladım:
$ clang -O noway.c
$ ./a.out
zsh: illegal hardware instruction ./a.out
Wat.
Optimizasyon olmadan derlersem beklendiği gibi askıda kalıyor. Meclise baktım ve tüm çan ve ıslık olmadan main
fonksiyon şöyle görünüyor:
_main: ## @main
pushq %rbp
movq %rsp, %rbp
ud2
ud2
Görünüşe göre nerede tanımsız davranış için bir talimattır. Yukarıda sözü edilen şüpheli iddia olan "Asla geri dönmeyen bir işlev UB'dir". Yine de inanmakta zorlanıyorum. Gerçekten mi!? Sıkma döngüsünü güvenle yazamaz mısınız?
Sanırım sorularım:
- Bu olup bitenler hakkında doğru bir okuma mı?
- Öyleyse, biri beni doğrulayan resmi bir kaynağa yönlendirebilir mi?
- Bu tür bir optimizasyonun gerçekleşmesini istediğiniz durum nedir?
Alakalı bilgi
$ 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;
ya da daha iyisi ..while (1);
unsigned int