-1

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

1 回答 1

3

您在这里至少有一个问题:

char** rows;
rows=(char**)malloc(3);

这分配了 3 个字节。在大多数平台上,分配器可能至少有 4 个字节,这让您可以稍微覆盖缓冲区。我猜您的挡泥板库在检查和捕获覆盖方面更加严格。

但是,如果您想要一个包含 3 个指针的数组,则char *可能至少需要 12 个字节。

尝试将这些行更改为:

char** rows;
rows=(char**)malloc(3 * sizeof(char *));

编辑:根据您修改后的代码,我同意它现在看起来是正确的。我唯一可以建议的是,它可能malloc()会失败并导致 NULL 指针访问。如果不是这种情况,这听起来像是一个错误或挡泥板的错误配置。

于 2012-12-06T04:52:44.327 回答