為什麼整數溢位會導致 x86 上的 GCC 無限循環?
由於未定義的行為,提供的程式碼在 GCC 上進入無限循環通過有符號整數溢出。雖然 x86 整數指令通常會在溢位時換行,但在這種情況下,GCC 會最佳化循環測試。
詳細資料:
- 因為整數溢位是未定義的行為,任何事情可能會發生,包括異常行為,例如不環繞。
- GCC 通常會在假設明確定義的行為的情況下執行最佳化,包括循環測試最佳化。
- 但是,溢位導致的未定義行為破壞了這個假設。
- 優化後的程式碼跳過循環測試,導致無限循環。
解決方案:
- 要獲得環繞行為,請使用使用GCC 編譯時的-fwrapv 標誌,可為有符號整數啟用定義明確的包裝語意。
- 請注意,與未受保護的最佳化行為相比,這可能會影響效能。
以上是為什麼有符號整數溢位會導致 GCC x86 最佳化中的無限循環?的詳細內容。更多資訊請關注PHP中文網其他相關文章!