2016-04-26 60 views
4

我在面试官的讨论中遇到这个问题:如何检查指针是否写入分配的内存?

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

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

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

p++; 

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

*p=4; 

这意味着指针将离开分配的内存。

现在考虑一个情况,我分配了一些内存,但每当我的指针移出分配和写入该内存然后我想知道,但如何?

我只有malloc和免费使用。

+14

C没有自动边界检查。您必须手动跟踪分配的大小。 – EOF

+0

不清楚。为什么不使用工具来完成工作? –

+4

你应该向你的面试官指出'int * p =(int *)malloc(4);'是写得很差的C代码。你应该总是避免在C中返回malloc。“这也假设'int'是一些任意平台上的4字节值,这可能是常见的,但肯定是不安全的。 –

回答

1

C没有提供你主动请求的东西,编译器通常不会在非静态变量上检测出超出范围的数组。

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

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

你可以做的是让你自己的数据结构包含长度信息等等,并且拥有你自己的使用这种结构的读/写功能。这是像PHP和python这样的高级语言在内部完成的典型方法。

2

有一个库名为Electric Fence这就是你想要的。

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