共用方式為


使用安全整數函式

最小化安全性問題的其中一種方法是防止整數溢位和下溢。

  • 當算術運算的結果大於要接收它之數據類型的記憶體空間時,就會發生整數溢位。 此作業會導致整數截斷和不正確的結果。 例如,如果您新增兩個導致值大於 2^31-1的 32 位整數,則會截斷結果以符合 32 位整數空間,這可能會導致程式代碼中的非預期行為。

  • 整數下溢發生在一個運算(通常是減法)導致錯誤結果時。 例如,如果您從INT_MIN減去數位(32 位帶正負號整數的最小值),則會截斷結果以符合 32 位整數空間,這也可能導致非預期的行為。

  • 由於截斷不符合新記憶體空間的結果,兩種數據類型之間的轉換也可能會導致不正確的結果。

ntintsafe 連結庫提供一組 C 函式,以界限檢查來執行安全的整數算術作業,以防止內核模式程式代碼中的溢位和下溢。 所有函式都在 ntintsafe.h 頭檔中,隨附於 Windows 驅動程式套件 (WDK)。 這些函式對應於應用程式代碼中使用的 Windows IntSafe 函式。

您可以使用這些函式來計算索引或緩衝區大小,或計算某種形式的界限檢查。 函式已針對速度優化。

安全整數函式提供下列優點:

  • 目的地緩衝區的大小總是提供給函式,以確保函式不會寫入超出緩衝區末端的內容。

  • 即使作業截斷預定的結果,緩衝區仍保證以 Null 終止。

  • 所有函式都會傳回NTSTATUS,只有一個可能的成功碼 (STATUS_SUCCESS) 和一個可能的錯誤條件 (STATUS_INTEGER_OVERFLOW)。 例如, NTSTATUS status = RtlIntSub(INT_MIN, 1, &result); 應該傳回結果 = -2,147,483,649,但這個數字無法在 32 位字段中表示。 result 是未定義的,而 status 是 STATUS_INTEGER_OVERFLOW,這是返回用以報告溢位和下溢的狀態值。

ntintsafe 連結庫有兩種函式類別:

  • 轉換函式: 這些函式會執行兩種數據類型之間的轉換。

  • 算術函式:這些函式會針對每個數據類型執行加法、減法和乘法運算。

安全整數函式 Kernel-Mode 摘要

匯入 Kernel-Mode 安全整數函式