【问题标题】:How to check that pointer is writing in the out of allocated memory?如何检查指针是否写入分配的内存不足?
【发布时间】:2016-08-20 05:15:45
【问题描述】:

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

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

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

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

p++;

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

*p=4; 

这意味着指针即将超出分配的内存。

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

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

【问题讨论】:

  • C 没有自动边界检查。您必须手动跟踪分配的大小。
  • 不清楚。为什么不使用工具来完成工作?
  • 你应该向你的面试官指出int *p = (int *)malloc(4); 是写得很糟糕的 C 代码。您应该始终避免在 C 中强制转换 malloc 的返回值。这还假设 int 在某些可能很常见但肯定不安全的任意平台上是一个 4 字节值。
  • 在您提供的情况下,读取和写入绝对是未定义的行为,但很可能是“安全的”,因为底层内存分配例程很少会在一个块中只给您 4 个字节.但是,如果您想被警告,您需要 a) 使用 C 以外的其他东西,b) 使用内存管理库(有很多开销并且)检测超出范围的内存读/写,c) 使用Valgrind 或 Coverity 等动态代码分析工具。
  • @Salman 总的来说,valgrind 是一个非常好的工具,但我不太确定它是否适合您的需要。

标签: c pointers memory-management malloc


【解决方案1】:

C 不具备您天生要求的功能,编译器通常不会检测到非静态变量上的越界数组。

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

在编译时,存在分析工具(静态分析)来模拟程序的行为,并尝试检测此类不当行为。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2011-03-05
      • 2018-11-29
      • 2019-04-22
      • 2011-11-15
      • 2021-04-04
      • 1970-01-01
      • 2016-08-19
      • 2023-02-02
      相关资源
      最近更新 更多