2012-12-06 76 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