2016-10-17 72 views
0

目前我正在使用Valgrind來檢查內存泄漏,並將Purify作爲替代方案。 Valgrind可以找出堆中創建的數組的訪問衝突,但不能堆棧。可以淨化找出堆棧變量的訪問衝突嗎?

char* a = static_cast<char*>(malloc(sizeof(char) * 5)); 
a[7] = 'c'; 
printf("%c\n", a[7]); 
free(a); 

Valgrind在上述代碼中無效寫入和讀取的點數,但不包括以下代碼。

char a[5] = {0}; 
a[7] = 'c'; 
printf("%c\n", a[7]); 

可以Purify標識這兩個代碼塊的訪問衝突嗎?

回答

0

根據用戶指南(ftp://ftp.software.ibm.com/software/rational/docs/v2003/purify/html/ht_m_sbr.htm)和(ftp://ftp.software.ibm.com/software/rational/docs/v2003/purify/html/ht_m_sbw.htm),Purify可以檢測堆棧邊界讀取和寫入。

但是,通過Purify也檢測到您的實際示例僅存在堆數據違規。我只測試了來自IBM(7.0.1)的最新版本,既適用於Linux,也適用於Solaris。

對於gcc 4.8及更高版本,您可能需要查看-fsanitize = address。