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