gpt4 book ai didi

c - malloc函数返回值的随机性是多少?

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:31 37 4
gpt4 key购买 nike

我在一个尘土飞扬的旧项目中找到了这段代码:

int *p = (int*)malloc(sizeof(p));           // generate random number
free(p); // free up space
int rand = p%3; // get random value in between 0-2

除了因为我们在 C 标准库中得到 srand 是糟糕的风格和不必要之外,返回值的实际随机性是什么?

虽然在使用它的上下文中不需要真正的随机性,但我对其进行了多次测试,每次迭代 99999999 次,并且对于每一次测试运行,rand == 0 的真实性低于其他两种情况(rand == 1rand == 2)。

一个例子:

  • rand == 0:99999999 次中有 27343746 次为真
  • rand == 1:99999999 次中有 36328138 次为真
  • rand == 2:99999999 次中有 36328115 次为真

最佳答案

这是一种非常愚蠢的获取随机数的方法。它的行为极度依赖于平台以及应用程序代码正在做什么。例如,如果您在没有其他内存分配的循环中调用它,那么在许多系统上 malloc 将不断地返回相同的 block ,因为 free 返回它到空闲列表的前面,所以 p 每次都是一样的。在许多其他情况下,当堆增长到一定大小时,您最终会得到一个循环,然后分配器循环通过多个槽。

这种特殊的可能性显然是您的实验中发生的事情:您在 70/256 个案例中得到 rand==0 并且 rand==1rand= =2 在 93/256 的情况下(除了,大概是从尚未达到循环的前几次分配和最后的部分循环)。我对 malloc 实现不够熟悉,无法解释这个特定的分布;可能 malloc 使用的控制结构的大小是 3 的倍数,这将创建一个偏置模 3。

模 2 的幂,你会在每个现实平台上得到一个偏差,因为返回值保证对任何类型正确对齐,而且大多数平台对 2 的幂有对齐约束。或者,换句话说,一个p 的几个最低位始终为 0。

rand 是标准的 C,而且在大多数平台上都很糟糕(甚至不要考虑将它用于与安全相关的任何事情,即使是概率算法,它通常也不够好),它很少会比 malloc 输出差。

可能有一些平台将 malloc 的返回值随机化,以便更难利用缓冲区溢出和释放后使用等漏洞(因为攻击者无法预测有趣的对象会在哪里,与 ASLR 相同),但这样的平台无论如何都会有更好的随机生成器 API。

关于c - malloc函数返回值的随机性是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40429433/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com