2013-02-27 102 views
1

我已閱讀以下vulnerability report in grepthe associated commit其中所有的integerunsigned integer被替換爲size_t正在將int轉換爲size-t避免數字溢出?

我有一個簡單的問題:由size_t更換unsigned integer避免溢出號(或其他類型的攻擊。如果它是爲什麼(其實我看不出有什麼它的變化,因爲我相信,size_t的定義是? typedef unsigned int size_t;)。

+0

size_t的*定義*爲:「sizeof'運算符返回的類型」。除了要求它是一個無符號類型之外,標準保留了實際的類型。 – Jens 2013-02-27 19:34:07

回答

4

size_t可能會在系統上被unsigned int類型化,但在其他系統上,特別是嵌入式(非X86)系統中,可能並不是這樣。按照ANSI標準,unsigned int可以小到16位。

size_t是在每個系統上定義的,要保證足夠大以給出該系統上任何可能的對象的大小。在這個漏洞的情況下,我猜((unsigned int) - >(size_t)實際上並不是該修復程序的一部分,至少在X86系統上是這樣,但是是相關清理的一部分,以保證沒有問題。

這也只是一個很好的編程習慣。

1

unsigned integer從來沒有溢出,它不能。對無符號類型算術使用模運算來完成。所以,不,更換unsigned integer不會size_t不會避免任何溢出,因爲沒有任何溢出首先要避免與unsigned int

作爲對某些評論的迴應,我的意思是「溢出」,當標準將「整數溢出」描述爲未定義的行爲時使用「溢出」。例如,當標準陳述「未定義行爲的一個例子是整數溢出的行爲」。當數值不適合數據類型時,它並不暗示無符號整數會導致未定義的行爲。此外,該標準表示:

涉及無符號的操作數的一種計算可以從未溢流, 因爲不能由所得到的無符號整數類型所表示的結果是 減小模比所述一個最大值大的數可以通過 所得類型表示

(部分6.2.5,第9段)

+4

無符號整數絕對可以溢出,只是與有符號整數的方式不一樣 – 2013-02-27 19:27:13

+1

@DanF:我的意思是標準中使用「溢出」這個詞的「溢出」。整數溢出是未定義的行爲(再次,使用「溢出」與標準相同的方式)。 – Cornstalks 2013-02-27 19:27:41

+1

那麼在grep中替換的解釋是什麼? – 2013-02-27 19:27:47

1

爲size_t能夠表示以字節爲單位的任何對象的大小的類型:爲size_t是用t返回的類型他是sizeof運算符,並廣泛用於標準庫中以表示大小和計數。

因此,size_t ia始終能夠正確表示尺寸,並且永遠不會溢出。

此外,size_t可能比unsigned int更大,相等甚至更小,並且您的編譯器可能會爲了優化目的對其進行假設。所以,size_t和unsigned int是不同的。

1

size_t可以比int更大(並且它在大多數64位計算機上),並且size_t是表示大小/長度的正確類型。

該修補程序將unsigned int更改爲size_t,以避免存在更多可用內存的可能問題,該問題可以存儲在無符號整數中,也可以是int。如果有足夠的內存可用,它們將包裝/溢出。儘管包裝一個int可能會給你帶來負面結果,但比包裝一個未簽名的結果更致命(容易發生崩潰)。

所以看起來真正的問題是圍繞着一個int,給你一個負面的結果,使得可以將內存索引到應該可能的位置以外 - 修復這個問題以使用一個unsigned int - 你也可以改變它使用更正確的size_t。