2016-04-26 58 views
4

我在面試官的討論中遇到這個問題:如何檢查指針是否寫入分配的內存?

如果我從malloc中分配了4個字節的內存。

int *p = (int*) malloc(4); 

現在如果我移動指針4個字節。

p++; 

而現在指針指向的內存超出malloc分配的4字節內存。我們假設這個內存有讀寫的權限。

*p=4; 

這意味着指針將離開分配的內存。

現在考慮一個情況,我分配了一些內存,但每當我的指針移出分配和寫入該內存然後我想知道,但如何?

我只有malloc和免費使用。

+14

C沒有自動邊界檢查。您必須手動跟蹤分配的大小。 – EOF

+0

不清楚。爲什麼不使用工具來完成工作? –

+4

你應該向你的面試官指出'int * p =(int *)malloc(4);'是寫得很差的C代碼。你應該總是避免在C中返回malloc。「這也假設'int'是一些任意平臺上的4字節值,這可能是常見的,但肯定是不安全的。 –

回答

1

C沒有提供你主動請求的東西,編譯器通常不會在非靜態變量上檢測出超出範圍的數組。

在運行時,如果使用像valgrind和libefence這樣的工具,可以檢測到這些。但是這些工具只用於調試而不是釋放,因爲它們會增加內存壓力,CPU使用率和上下文切換。

在編譯時,存在分析工具(靜態分析),它們模擬程序的功能,並嘗試檢測這些不當行爲。

你可以做的是讓你自己的數據結構包含長度信息等等,並且擁有你自己的使用這種結構的讀/寫功能。這是像PHP和python這樣的高級語言在內部完成的典型方法。

2

有一個庫名爲Electric Fence這就是你想要的。

它攔截你的malloc調用。它通過分配內存頁面並將頁面邊界精確放置在分配內存的末尾來工作。分配的 內存後的頁面未映射。如果程序嘗試寫入已分配的內存,則會生成SIGSEGV(分段錯誤)。