的情況如下:在64位機器上發生32位整數溢出時會發生什麼?
- 32位整數溢出
- malloc的,這是期待 64位整數64位機器上使用該整數作爲輸入現在
其聲明是正確的(如果有的話):
說有符號的二進制整數111111110011011000001010110由於溢出,01000簡直是負值。這是一個實際存在的問題,因爲您可能需要分配比您在32位整數中描述的字節更多的字節。但是,它會以64位整數讀入。
Malloc
讀取此作爲一個64位整數,#是代表任何數據的原始整數之後存儲一個通配符位發現11111111001101100000101011001000################################
。換句話說,它讀取的結果接近其最大值2^64,並嘗試分配一些字節。它失敗。Malloc
將其作爲64位整數讀取,並將其轉換爲0000000000000000000000000000000011111111001101100000101011001000
,這可能是因爲它是如何將它加載到寄存器中而留下大量零位的。它不會失敗,但會分配負的內存,就像讀取一個正的無符號值一樣。Malloc
將其作爲一個64位整數讀取,轉換爲################################11111111001101100000101011001000
,可能是因爲它是如何將它加載到寄存器中的,並且#代表通配符,表示之前在寄存器中的任何數據。取決於最後一個值,它不可預測地失敗。- 該整數不會溢出,因爲即使它是32位,它仍然在一個64位寄存器,因此malloc工作正常。
我實際上測試過這一點,導致malloc失敗(這意味着要麼1或3是正確的)。我假設1是最合乎邏輯的答案。我也知道修復(使用size_t作爲輸入而不是int)。
我真的很想知道實際發生了什麼。出於某種原因,我沒有找到關於32位整數是如何在64位機器上實際處理這種意外「鑄造」的任何澄清。我甚至不確定它是否在註冊表中很重要。
它取決於體系結構。有些體系結構本身並不具有32位數字,他們將所有操作視爲64位。無論是否有符號溢出都是未定義的行爲,無符號溢出都有很好的文檔記錄,並且如何補充兩種工作方式。 – Mgetz
這取決於系統,但很可能它會像任何其他整數一樣溢出 –
@ nikolaMM94但是,溢出有符號整數是未定義的行爲 - 根據具體情況可能會發生許多不同的事情。 – nos