一.動態內存分配是一個很容易出現程序漏洞的領域,且一旦出錯不易查找.這些錯誤通常由兩種原因引起:
1.指針malloc()分配的內存的指針值發生變化,又沒有別的指針指向它,那麼這塊內存在程序退出將變得無法訪問.
2.在一個已分配的內存塊前或後寫數據,很可能會損壞malloc函數庫用於記錄分配情況的數據結構.出現這種情況後,過一段時間後,再調用malloc或free都可能失敗而引起程序崩潰,要找這類錯誤的發生地點和準確時間是困難的,因爲錯誤的發生是在很久以前.
有很多工具可以幫助發現這些錯誤,例如Electricfence和valgrind
二.
1.Electricfence
Electricfence嘗試用linux的虛擬內存機制來保護malloc和free所使用的內存,當它發現內存被破壞時停止程序運行.這個程序不是linux自帶的,我們需要從網上下載(可以使用ubuntu的Synaptic Package Manager軟件安裝)
下面的程序efnece.c調用malloc分配了1024字節的內存,程序試圖寫這塊內存後的第一個字節
/*efence_test.c*/
#include <stdlib.h>
int main()
{
char *ptr = (char *)malloc(1024);
ptr[0] = 0;
ptr[1024] = 0;
return 0;
}
gcc編譯運行後沒有發現任何異常,但malloc所分配的內存可能已被破壞,我們遲早會遇到麻煩
安裝Electricfence後,就可以在編譯時加入efence庫
gcc -g -o efence_test efence_test.c -lefence
2.valgrind
valgrind工具能檢測到前面所說的錯誤,還能檢測到數組越界錯誤,這個軟件也不是linux自帶的,需要到http://developer.kde.org/~sewardj上找到.(ubuntu系統也可以通過Synaptic Package Manager軟件安裝)
使用valgrind工具不需要重新編譯,它還可以用來調試一個正在運行的程序
/*checher.c*/
#include <stdlib.h>
int main()
{
char *ptr = (char *)malloc(1024);
char ch;
ch = ptr[1024];
ptr[1024] = 0;
ptr = 0;
return 0;
}
編譯好checher後,直接用命令valgrind --leak-check=yes -v ./checker