2011-10-09 195 views
1

爲什麼有可能超過C中的緩衝區大小達到一定的限制而沒有任何錯誤(分段錯誤)?超過緩衝區大小?

例如,我用這個代碼玩:

#include <stdio.h> 
#include <string.h> 

void function1(char *a) { 
    char buf[10]; 
    strcpy(buf, a); 
    printf("End of function1\n"); 
} 

main (int argc, char *argv[]) { 
    function1(argv[1]); 
    printf("End of main\n"); 
} 

我能夠作爲一個參數傳遞最多23個字符,而不是10個字符沒有任何錯誤,但是當我使用24個字符,我收到了分段故障。

我知道用第二十四個字符,我得到了返回值。但以前的13 ??怎麼樣!

回答

3

您確實收到錯誤消息。你超過了緩衝區大小,沒有發生任何可怕的事情。天真地說,當你超過一個緩衝區時會發生一些可怕的事情。你所期望的沒有發生,錯誤的定義。

我不想變得輕浮。我的觀點是嚴肅的 - 如果你違反規則,你不知道會發生什麼。您可能會收到錯誤消息。它可能顯得很好。其他事情可能會發生。原則上,這是不可預測的。它可能會從編譯器到編譯器,操作系統到操作系統,甚至運行運行。

可能發生在這種情況下的是buf是堆棧中的最後一個東西,以及它沒有用於任何關鍵事物之後的空間。所以使用一些無害的空間後。您最終可能會遇到嚴重的結構,或者遇到不可寫入的頁面,從而導致錯誤。

1

這就是未定義行爲的美妙之處

  • 對於C,書寫陣列外部是非法
  • 對於操作系統,在未映射地址或在用錯誤的權限(只讀)映射的地址進行寫入非法

這些允許做什麼過程的想法並不總是完美匹配。

C程序完全有可能做一些完全的腦損傷,使操作系統說「這對我來說沒問題」,因爲它與正常操作無法區分。

回到你的問題,它可能是前13個字節實際上並沒有打擾操作系統(他們寫在一個有效的頁面)。然後下一個字節可能會觸及只讀內存或未映射地址,操作系統有機會發現錯誤。