Trong khi điều tra một yêu cầu đáng ngờ , tôi đã viết chương trình thử nghiệm nhỏ nàynoway.c
int proveit()
{
unsigned int n = 0;
while (1) n++;
return 0;
}
int main()
{
proveit();
return 0;
}
Kiểm tra cái này, tôi nhận được:
$ clang -O noway.c
$ ./a.out
zsh: illegal hardware instruction ./a.out
Wat.
Nếu tôi biên dịch mà không tối ưu hóa, nó sẽ bị treo như mong đợi. Tôi nhìn vào hội đồng, và không có tiếng chuông và tiếng huýt sáo, main
chức năng trông như thế này:
_main: ## @main
pushq %rbp
movq %rsp, %rbp
ud2
Trong trường hợp ud2
dường như là một hướng dẫn đặc biệt cho hành vi không xác định. Yêu cầu đáng ngờ đã nói ở trên, "Một chức năng không bao giờ trả lại là UB", được củng cố. Tôi vẫn thấy khó tin. Có thật không!? Bạn không thể viết một vòng lặp một cách an toàn?
Vì vậy, tôi đoán câu hỏi của tôi là:
- Đây có phải là một cách đọc đúng về những gì đang xảy ra?
- Nếu vậy, ai đó có thể chỉ cho tôi một số tài nguyên chính thức xác minh nó không?
- Tình huống mà bạn muốn loại tối ưu hóa này xảy ra là gì?
Thông tin liên quan
$ 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