您正在導致未定義的行爲,很簡單。你無法真正地說「在這種情況下,爲什麼這種未定義的行爲會產生這種結果,但是在另一種情況下會產生不同的結果?」
使用objdump的或GDB如果你想看到什麼指令導致堆得下優化不同。
編輯:例如,與-O
標誌編譯時,有第一printf
(編譯爲32位的清晰度)之前單獨堆了不少的差異在main
開頭:
未優化:
0x080483c4 <+0>: push ebp
0x080483c5 <+1>: mov ebp,esp
0x080483c7 <+3>: and esp,0xfffffff0
0x080483ca <+6>: sub esp,0x20
0x080483cd <+9>: mov DWORD PTR [esp+0x18],0x37
0x080483d5 <+17>: mov DWORD PTR [esp+0x10],0x4
0x080483dd <+25>: mov DWORD PTR [esp+0x14],0x5
0x080483e5 <+33>: mov eax,0x8048514
0x080483ea <+38>: mov DWORD PTR [esp],eax
0x080483ed <+41>: call 0x80482e0 <[email protected]>
優化:
0x080483c4 <+0>: push ebp
0x080483c5 <+1>: mov ebp,esp
0x080483c7 <+3>: push ebx
0x080483c8 <+4>: and esp,0xfffffff0
0x080483cb <+7>: sub esp,0x20
0x080483ce <+10>: mov DWORD PTR [esp+0x18],0x4
0x080483d6 <+18>: mov DWORD PTR [esp+0x1c],0x5
0x080483de <+26>: mov DWORD PTR [esp],0x8048504
0x080483e5 <+33>: call 0x80482e0 <[email protected]>
你設爲b通過讀取越界來讀取堆棧。在正常構建中,您會看到55個打印(值爲b),但是在優化構建中,b會被刪除,因此您不會看到它。 – hackworks