我刚刚实施了一个相当复杂的软件,但我学校的测试系统不会接受它。 系统使用所谓的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;
这会产生一个带有mudflap的段错误。在我看来,这是一个完全合法的代码。 你能否向我解释一下它有什么问题,为什么它会产生一个带有mudflap的段错误?
注意:程序应该使用以下命令在带有g ++的amd64 linux系统下编译:
export MUDFLAP_OPTIONS='-viol-segv -print-leaks';
g++ -Wall -pedantic -fmudflap -fmudflapir -lmudflap -g file.cpp
答案 0 :(得分:3)
这里至少有一个问题:
char** rows;
rows=(char**)malloc(3);
这分配3个字节。在大多数平台上,分配器可能至少有4个字节,这样您就可以稍微重写缓冲区。我猜测你的mudflap库在检查时更加严格,并且可以捕获覆盖。
但是,如果你想要一个3 char *
个指针的数组,你可能需要至少12个字节。
尝试将这些行更改为:
char** rows;
rows=(char**)malloc(3 * sizeof(char *));
编辑:根据您修改的代码,我同意它现在看起来正确。我唯一可以建议的是,malloc()
可能失败并导致NULL指针访问。如果不是这样的话,那听起来像是一个错误或错误配置的mudflap。