2012-12-06 109 views
-1

我剛剛實現了一個非常複雜的軟件,但我的學校的測試系統不會考慮它。 該系統使用所謂的mudflap庫,它應該能夠更好地防止非法內存訪問。因此,我的程序在學校的測試系統上運行時會生成段錯誤(我提交源代碼並且測試系統使用mudflap庫自行編譯它)。Mudflap和指針陣列

我試圖隔離我的程序中有問題的代碼,它似乎都歸結爲像指針數組一樣簡單。 Mudflap似乎並不喜歡它們。

下面是一塊一些非常簡單的代碼與同一個指針數組的工作原理:

#include <stdlib.h> 
int main() 
{ 
char** rows; 
rows=(char**)malloc(sizeof(char*)*3); 
rows[0]=(char*)malloc(sizeof(char)*4); 
rows[1]=(char*)malloc(sizeof(char)*4); 
rows[2]=(char*)malloc(sizeof(char)*4); 
strcpy(rows[0], "abc"); 
strcpy(rows[1], "abc"); 
strcpy(rows[2], "abc"); 
free(rows[0]); free(rows[1]); free(rows[2]); 
free(rows); 
return 0; 

這將產生與擋泥板段錯誤。在我看來,這是一個完全合法的代碼。 你能否向我解釋一下它有什麼問題,以及爲什麼它會產生帶擋泥板的段錯誤?

注:該計劃應在AMD64 Linux系統下使用下列命令進行編譯使用g ++:

export MUDFLAP_OPTIONS='-viol-segv -print-leaks'; 
    g++ -Wall -pedantic -fmudflap -fmudflapir -lmudflap -g file.cpp 
+1

這是不正確的代碼。你分配3個字節,而不是3 * sizeof(char *)。你也在泄漏記憶。 – WhozCraig

+0

我修復了代碼。這實際上只是一個錯字。關鍵是 - 這個版本也不起作用。 (現在我甚至釋放分配的內存,即使在這裏沒有意義。) – PSkocik

回答

3

您至少有一個問題就在這裏:

char** rows; 
rows=(char**)malloc(3); 

這種分配3個字節。在大多數平臺上,分配器可能至少有4個字節,這樣可以避免重寫緩衝區。我猜你的mudflap庫在檢查時更嚴格,並且會覆蓋覆蓋。

但是,如果你想要一個3 char *指針數組,你可能至少需要12個字節。

嘗試改變這些行:

char** rows; 
rows=(char**)malloc(3 * sizeof(char *)); 

編輯:基於您的修改後的代碼,我同意,現在看起來是正確的。我可以建議的唯一的事情是,malloc()可能會失敗並導致NULL指針訪問。如果不是這種情況,它聽起來像一個錯誤或配置錯誤的擋泥板。

+0

我的歉意。是啊,你說得對。對malloc的第一個參數應該是sizeof(char *)。 問題是。它也不起作用。 :/ – PSkocik

+0

malloc()只有一個參數。你的意思是'3 * sizeof(char *)'? –

+0

我修復了我的問題中的代碼。重點在於它仍然不喜歡它:/。 – PSkocik