2014-03-05 33 views
3

我覺得讀記憶應該不會造成如讀取內存是否可能發生分段錯誤?

char *d=""; 
char *d2="test"; 
memcmp(d,d2,10); 

什麼問題都memcmp()曾經失敗?

+0

memcmp(0,0,10)將segfault ...它假定指針參數指向程序中的有效內存。 – amdn

+1

@amdn,我不確定「意志」,因爲行爲有些不確定。 –

+0

@ s.bandara你是對的,它是未定義的行爲,但它在我知道的每個系統上都有錯誤。 – amdn

回答

5

您的假設是錯誤的,因爲在未映射到進程地址空間的地址處讀取內存將導致SEGV。特別是讀取地址0(在幾乎所有的體系結構上),並讀取內核內存空間(如果它甚至映射到內存空間),但通常讀取沒有物理內存映射爲可讀的邏輯內存。

在您的示例中,您正在對未分配的字節運行memcmp,這是未定義的行爲。它可能會從堆棧或數據段中讀取垃圾,但是您無法知道這一點。例如,d可能正好位於堆棧的頂部,因此您可能會超出堆棧頂部而進入未映射的內存(堆棧通常會向下增長)。

+0

「從堆棧或數據段中讀取垃圾」/「'd'可能正好位於堆棧頂部」 - 它本身在哪裏並不重要,因爲它是'memcmp()'所做的讀取存儲在'd'中的地址是危險的 - 我們知道它已經被設置爲一個永遠不會在堆棧中的字符串 - 傳統上它在數據段中。 –

+0

不像託尼說的那樣,只能在只讀部分中分配「d」的內存而不在函數堆棧中分配內存? –

+0

'd'是一個指針('char *'),所以'd'本身不會被讀取。 'd'指向的數據可能位於只讀存儲器中,或者可能位於可寫區域;您無法保證它在哪裏或者它的可寫性如何,並且沒有什麼可以阻止編譯器將它放在堆棧的頂部。重點是超出它的讀數是不確定的。 – abligh

相關問題