c-挡泥板和指针阵列



我刚刚实现了一个相当复杂的软件,但我学校的测试系统不会接受它。该系统使用了所谓的挡泥板库,应该能够更好地防止非法内存访问。因此,我的程序在学校的测试系统上运行时会生成segfault(我提交源代码,测试系统使用mudflop库自行编译)。

我试图隔离程序中有问题的代码,似乎这一切都可以归结为指针数组这样简单的东西。挡泥板似乎不喜欢它们。

下面是一段非常简单的代码,用于指针数组:

#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;

这将产生带有挡泥板的分段故障。在我看来,这是一部完全合法的法典。你能向我解释一下它出了什么问题,以及为什么它会产生带有挡泥板的segfault吗?

注意:该程序应该在带有g++的amd64 linux系统下使用以下命令编译:

export MUDFLAP_OPTIONS='-viol-segv -print-leaks';
g++ -Wall -pedantic -fmudflap -fmudflapir -lmudflap -g file.cpp

这里至少有一个问题:

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

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

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

尝试将这些行更改为:

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

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

相关内容

  • 没有找到相关文章

最新更新