2016-09-13 113 views
-3

我想使用「檢查庫」爲malloc(3)編寫一個檢查單元測試。在C中創建malloc()緩衝區溢出0

這個單元測試應該會產生緩衝區溢出。

  1. 在int變量上分配一個double(即int * ptr = malloc(3))緩衝區溢出?
  2. 怎麼樣分配一個大於int的最大值的數字?

您能否給我一些緩衝區溢出的簡單例子?

+0

數字的最大值是多少?所以我不能無限地在一個int值上寫數字。 – surveyCorps

+0

正如我所說,我的測試案例應該會產生緩衝區溢出。我可以這樣做,如果我分配的int指針(int * ptr = malloc(3))我給它一個很大的值(即* ptr = 59595959595959595959595959595)?那麼這是一個緩衝區溢出? – surveyCorps

+0

如果您的平臺上的sizeof(int)> 3'是一個緩衝區溢出。否則,不。 –

回答

0

寫入或讀取由malloc分配的緩衝區的末尾會產生undefined behavior,這意味着在發生時不能依賴任何特定行爲。該程序可能似乎工作,它可能會核心轉儲,或者它可能會輸出意外的結果。

因爲溢出一個malloc'ed緩衝區導致未定義的行爲,所以爲它創建測試用例是毫無意義的,除非您正在測試malloc的特定實現。根據你的問題的措辭,似乎並非如此。

2

要溢出緩衝區,您需要訪問超出其保證大小或開始之前的緩衝區。分配並不真正訪問任何可見的緩衝區,所以很難看到任何類型的分配是否會成爲緩衝區溢出,除非分配例程本身存在錯誤或其結構已損壞。

在int變量上分配一個double(即int * ptr = malloc(3))緩衝區溢出?

不,因爲沒有緩衝區被訪問。

如何分配一個大於int的最大值的數字?

不,因爲沒有緩衝區被訪問。

要溢出一個緩衝區,你必須首先有一個緩衝區,然後溢出它。例如:

int* j = malloc (2 * sizeof (int)); 
j[2] = 1; 

在這裏,我分配緩衝區與兩個整數空間,然後通過訪問第三整數(0是第一個,1是第二,所以圖2是第三)溢出它。

+1

並且'int i = j [2];'會是一個緩衝區溢出,儘管是讀取而不是寫入操作。它也會訪問未初始化的數據,就像'i = j [0];'或'i = j [1];'它們不是緩衝區溢出,否則就是OK。 –