x86 上的整數溢位:揭開無限循環之謎
考慮以下程式碼片段,當使用 GCC編譯時,它會神秘地陷入無限循環:
秘密解開
雖然整數溢出通常是未定義的行為,但如果發生溢出, x86 架構的整數算術指令通常會迴繞。然而,在這種情況下,GCC 的最佳化引入了異常。
最佳化的不幸
啟用最佳化後,GCC 假定不可能出現整數溢出,並消除循環退出條件檢查。因此,當整數 i 環繞為負值時,循環會無止盡地繼續。
Visual Studio 的正確處理
Visual Studio,另一方面,正確處理整數溢位並按預期退出循環。
確定未定義行為
這種奇怪的行為凸顯了未定義行為的不可預測性。儘管 x86 上需要整數環繞,但未定義的行為可能會以意想不到的方式表現出來,從而使編譯器的預測受挫。
解決方法
結論
GCC 在存在未定義行為的情況下選擇優化循環退出條件會導致令人困惑的結果無限循環。這提醒人們違反未定義的行為規則會產生不可預測的後果,在 x86 平台上使用整數算術時需要小心。
以上是為什麼此 C 程式碼在啟用最佳化的 GCC 上產生無限循環?的詳細內容。更多資訊請關注PHP中文網其他相關文章!