如何检查指针是否写入超出已分配内存的区域?

3
我在与面试官讨论中遇到了这个问题:
如果我从malloc中分配了4个字节的内存。
int *p = (int*) malloc(4);

如果我将指针移动了4个字节。

p++;

现在指针指向的内存已经超出了由malloc分配的4字节内存范围。假设这块内存具有读写权限。

*p=4; 

这意味着指针超出了分配的内存范围。

现在考虑一种情况,我分配了一些内存,但是每当我的指针移动到已分配的内存之外并写入该内存时,我想得到通知,但是如何做到呢??

我只能使用malloc和free。


14
C语言没有自动边界检查。您需要手动跟踪您分配的内存大小。 - EOF
不清楚。为什么不使用工具完成这项任务呢? - Sourav Ghosh
4
你应该向面试官指出int *p = (int *)malloc(4);是非常糟糕的 C 代码。在 C 中应该避免对 malloc 的返回值进行强制类型转换。这还假设 int 在某些任意平台上是 4 字节,这可能很普遍,但肯定不安全。 - David Hoelzer
2
在您提供的情况下,读取和写入肯定是未定义行为,但很可能是“安全”的,因为底层内存分配例程很少会在一个块中给您只有4个字节。然而,如果您想要得到警告,您需要a)使用除C以外的其他东西,b)使用具有大量开销并检测越界内存读取/写入的内存管理库,c)使用像Valgrind或Coverity这样的动态代码分析工具。 - David Hoelzer
2
@Salman 一般来说,Valgrind 是一个非常好的工具,但我不太确定它是否适合你的需求。 - Sourav Ghosh
显示剩余2条评论
2个回答

2
有一个名为Electric Fence的库可以实现你想要的功能。
它会拦截你的malloc调用。它通过分配内存页面,并将页面边界正好放置在你分配的内存的结尾处来工作。分配内存之后的页面是未映射的。如果程序试图写入超出分配内存范围的部分,就会产生SIGSEGV(段错误)。

1

C语言本身不支持您所请求的功能,并且编译器通常无法检测非静态变量的越界数组。

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

在编译时,存在分析工具(静态分析),可以模拟程序的操作,并尝试检测此类错误行为。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接