为什么malloc真的不确定?(的Linux/Unix)

Ole*_*828 8 c malloc non-deterministic linux-kernel

malloc不保证返回0的内存.传统观点不仅如此,而且内存malloc返回的内容实际上是非确定性的,例如openssl将它们用于额外的随机性.

但是,据我所知,malloc建立在brk/sbrk之上,它可以"返回"0'ed内存.我可以看到为什么malloc返回的内容可能不是0,例如来自以前的免费内存,但为什么它们在"普通"单线程软件中是非确定性的呢?

  1. 传统智慧是否真实(假设相同的二进制和库)
  2. 如果是这样,为什么?

编辑几个人回答解释为什么内存可以是非0,我已在上面的问题中解释过.我问的是为什么使用malloc返回的内容的程序可能是非确定性的,也就是为什么它每次运行时都会有不同的行为(假设相同的二进制文件和库).非0表示非确定性行为.换句话说:为什么每次运行二进制文件时它都有不同的内容.

Meh*_*dad 11

Malloc不保证不可预测性......它只是不能保证可预测性.

例如,考虑一下

 return 0;
Run Code Online (Sandbox Code Playgroud)

是malloc的有效实现.


Jen*_*edt 2

我认为它是非确定性的假设是完全错误的,特别是当您要求非线程上下文时。(在线程上下文中,由于调度 alea,您可能会有一些不确定性)。

试试吧。创建一个连续的、确定性的应用程序

  • 进行一大堆分配
  • 用某种模式填充内存,例如用计数器的值填充它
  • 释放这些分配的每一秒
  • 新分配相同金额
  • 运行这些新的分配并注册文件中第一个字节的值(作为每行一个文本数字)

运行该程序两次并将结果注册到两个不同的文件中。我的想法是这些文件将是相同的。