ในขณะที่ตรวจสอบการอ้างสิทธิ์ที่น่าสงสัยฉันได้เขียนโปรแกรมทดสอบเล็กน้อยนี้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