我刚刚实现了一个相当复杂的软件,但我学校的测试系统不会接受它。系统使用了所谓的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