【问题标题】:malloc(): memory corruptionmalloc():内存损坏
【发布时间】:2017-04-24 10:39:57
【问题描述】:

这是我认为可能导致此错误的简化程序。

char *p = (char*)malloc(8192);
for(int i = 0; i < 9200; ++i){
  p[i] = '1';
}
char *s = (char*)malloc(strlen(p)); 

原来的项目比较复杂,所以我把它简化了。我使用 malloc 分配了 8192 个字节。然后我的程序将向数组中写入超过 8192 个字符。然后我将使用 malloc 分配内存。

这个小程序没有崩溃。但是在原来的大项目中,它崩溃了这个错误:

malloc():内存损坏:0x0000000007d20bd0 ***

什么可能导致这种差异?

【问题讨论】:

  • 您已分配 8192 字节,但尝试写入 9200 字节。这有什么意义?你试着不这样做怎么样,内存不会被破坏? :)
  • 除了尝试写入您尚未分配的内存之外,在您的 for 循环之后,p 现在指向您写入的最后一个 1 之后的字节。这意味着strlen(p) 不会返回任何有意义的内容。
  • 什么可能导致这种差异?”未定义的行为是未定义的。
  • strlen() 将在 任何 情况下失败(导致未定义的行为),因为没有写入 0-terminator。
  • 在C中也有no需要转换malloc()&朋友的结果。

标签: c linux memory-management


【解决方案1】:

它是 undefined behavior,因为您已分配 8192 字节内存,但您正在尝试写入 9200 字节。哪个越界了。

【讨论】:

  • 我知道,但是什么样的未定义行为?@rsp
  • 不存在不同类型的未定义行为。未定义的行为是未定义的。
  • @YuanWen:这里列出了许多调用未定义行为的情况:stackoverflow.com/documentation/c/364/…
  • @rootTraveller: all 没有必要让代码崩溃......再次:未定义的行为是未定义的。我已经看到这样的代码在生产环境中运行了多年...... :-(
  • @YuanWen 未定义行为意味着任何事情都可能发生。你的程序可能会崩溃,它可能会工作,它可能会引入微妙的数据损坏,它可能会格式化你的硬盘。加上合适的硬件,它可能会创建天网并开始灭绝人类。
【解决方案2】:

什么可能导致这种差异?

基本上,内存分配器会立即分配 内存供程序使用,并在其中为您提供一个指针(确保以下空间可供使用)。由于这些页面通常大于 8KiB,因此您的小程序没有问题。但是,如果一个更大的程序正在分配更多的内存并在分配空间的末尾越写越远,那么您最终将尝试写入未分配的内存(或另一个程序使用的内存!),从而破坏内存。

【讨论】:

  • char *p = (char*)malloc(8192); for(int i = 0; i &lt; 9200; ++i){ p[i] = '1'; } 这也应该表现得异常??
  • 不一定。只要超出分配空间的内存用于您的进程并且未使用,那么它就“很好”。但是,如果不深入研究操作系统的内存分配,就无法知道,所以尽量阻止自己访问超出分配空间的内存。该代码当然也会破坏内存。 malloc 结果只需要在正确的位置。
  • 写入用户空间中另一个进程的内存并不是你真正会在任何现代操作系统中使用 MMU 的 CPU 上做的事情,除非明确共享内存,但通常如果这是在这种情况下,您想要写入“其他程序使用的内存”。
  • 操作系统有修复损坏内存的方法吗?
【解决方案3】:

写入尚未分配的内存是未定义的行为。那是因为malloc() 返回了一段你可以写入的内存,所以当你写到那个区域的末尾时,你正在覆盖不属于你的东西。

这可能是 malloc 本身使用的结构,或者完全是其他东西。

【讨论】:

    【解决方案4】:

    这是运气的问题。您的操作系统可能会保留超过您请求的 8kB 的内存。此外,您之前和之后保留的内容可能会对行为产生影响。

    并不是说你的程序会在缓冲区溢出时崩溃。事实上,行为是未定义的或实现已定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2011-06-04
      • 1970-01-01
      相关资源
      最近更新 更多