我剛剛實現了一個非常複雜的軟件,但我的學校的測試系統不會考慮它。 該系統使用所謂的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
這是不正確的代碼。你分配3個字節,而不是3 * sizeof(char *)。你也在泄漏記憶。 – WhozCraig
我修復了代碼。這實際上只是一個錯字。關鍵是 - 這個版本也不起作用。 (現在我甚至釋放分配的內存,即使在這裏沒有意義。) – PSkocik