算術運算導致溢位。 整數溢位錯誤

2021-10-18 04:52:48 字數 1391 閱讀 6456

當程式嘗試儲存對於宣告的整數型別而言太大的整數值時,將發生整數溢位。這是一種算術溢位錯誤,不僅會導致錯誤的結果和系統不穩定,還會導致緩衝區溢位,並為攻擊者提供了切入點。讓我們看看為什麼可能發生整數溢位錯誤,它們怎麼可能很危險,以及如何防止它們。

在最基本的級別上,當算術運算的結果需要比目標變數更多的位時,將發生整數溢位。例如,您可以儲存在32位無符號整數變數中的最大數字是4,294,967,295。用十六進製制表示是0xffffffff,在這裡您可以清楚地看到所有位元組已經具有最大值(即,所有32位都已設定)。如果您有乙個計算得出的數字較大,則結果的所有位都不適合該資料型別的32位可用,並且會出現溢位。

整數溢位情況下的行為取決於硬體,編譯器和程式語言。在大多數現代系統中,該值實際上並不會溢位到相鄰的儲存位中,而是使用模運算將其包裹或截斷以適合該變數。

對於無符號整數,這通常意味著保留最低有效位(對於32位,這將是十進位制值的最後10位),實際上將結果環繞在零附近。例如,如果您有乙個帶有最大值的32位整數(無符號)並將其遞增42,則可能會得到4,294,967,295 + 42 =41。在某些專用硬體(例如訊號處理器)中,沒有環繞或截斷在這些情況下–最大值僅限於最大可表示的正數。

對於有符號整數型別,由於以二進位制表示負數的方式,事情變得更加奇怪。因為有符號整數的最左位僅對於負數為1,所以當正值溢位時,它實際上可能變為負數。如果負值變得小於當前有符號型別的最小值,則會出現下溢–負值上溢。

由於它們的不確定行為,眾所周知,整數上溢和下溢錯誤很難除錯。它們往往發生在非常特定的情況下,並且可能會靜默地返回不正確的結果,尤其是在與簽名錯誤結合時。例如,計數器變數可以初始化為-1,並在每次讀取之前遞增,這在理論上意味著它應始終為0或正值。如果出現問題,並且計數器仍為負數時將其強制轉換為無符號整數,則您可能會得到乙個從4,294,967,295向下計數而不是從0向上計數的計數器。

根據使用結果的位置,這種錯誤的計算可能導致從奇怪的錯誤訊息到太空飛行器墜毀的任何事情。但是,除了直接後果外,整數溢位還可以為攻擊提供起點。如果將來自使用者輸入的整數用作緩衝區大小,則攻擊者可能能夠操縱這些值以導致緩衝區溢位,從而可能導致任意**執行。此類漏洞通常涉及直接在記憶體緩衝區上執行的c / c ++程式。

因為整數溢位僅發生在有效**中的特定運算元值上,所以防止它們發生的唯一可靠方法是對理論上可能會出現溢位值的每個整數操作使用溢位檢查或值完整性測試。您可以為此使用內建的編譯器函式或外部庫。

使用適當的大整數型別也很重要,特別是如果將操縱大數的話。在python之類的程式語言中,數字變數的內部型別會自動調整以匹配它們的值,從而防止了基本整數溢位。

javascript算術運算溢位

js中的算術在溢位overflow,下溢underflow或被0整除時不會報錯。當數字結果超過了數字上限時,結果為乙個特殊的無窮大 infinity 值,在js中以infinity表示 同理,當負數超出了負數表示範圍,則結果為負無窮大,在js中用 infinity表示。下溢是當運算結果無限接近於0並...

整數運算 浮點運算與溢位

sizeof int 4 的機器上,也即 32 位機器,使用 int 型變數儲存 200 300 400 500 會得到 884901888。這顯然違犯了整數運算的特性,計算一組正數的乘積不應該產生乙個負數結果。另一方面,整數在計算機中的運算滿足數學上對整數運算的許多性質。乘法的結合和交換律,下面的...

算術運算導致溢位 CPU的控制器與運算器

計算機基礎方面的知識,對於一些非科班出身的同學來講,一直是他們心中的痛,而對於科班出身的同學,很多同學在工作之後,也意識到自身所學知識的不足與欠缺,想回頭補補基礎知識。關於計算機基礎的課程很多,內容繁雜,但無論是相關書籍還是大學課程,都有點脫離工作。特別地,計算機基礎知識體系龐雜,想要從零學習或者複...