如何检查指针是否在分配的内存中写入?

时间:2016-04-26 11:39:12

标签: c pointers memory-management malloc

我在与面试官的讨论中遇到了这个问题:

如果我从malloc分配了4个字节的内存。

int *p = (int*) malloc(4);

现在,如果我将指针移动4个字节。

p++;

现在指针指向的内存超出了malloc分配的4字节内存。我们假设此内存具有读写权限。

*p=4; 

这意味着指针已经超出了已分配的内存。

现在考虑一下我分配了一些内存的情况,但每当我的指针移出已分配并写入该内存时,我想知道但是如何?

我只有malloc并且可以免费使用。

2 个答案:

答案 0 :(得分:2)

有一个名为 Electric Fence 的库可以满足您的需求。

它拦截你的malloc调用。它的工作原理是分配内存页面并将页面边界精确地放在已分配内存的末尾。分配后的页面 内存未映射。如果程序尝试写入已分配的内存,则会生成SIGSEGV(分段错误)。

答案 1 :(得分:1)

C没有以你自己的要求为特征,编译器通常不会检测到非静态变量的绑定数组。

在运行时,如果使用valgrind和libefence等工具,可以检测到这些。但是,这些工具仅用于调试而不是释放,因为它们会增加内存压力,CPU使用率和上下文切换。

在编译时,存在分析工具(静态分析),模拟程序的功能,并尝试检测这些不良行为。

您可以做的是创建包含长度信息等的数据结构,并拥有自己的使用此结构的读/写函数。这是PHP和python等高级语言在内部执行的典型方法。