微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从未初始化的内存读取返回不同的答案每次

在Nicholas Ormrod在CppCon 2016上的讲话中,他提到了Facebook上一个隐藏的bug,其中一个字节从未初始化(未写入)页面被两次读取,使得第二次读取返回(非零)值不同的情况从第一个读取的值(零)。

他提到他们使用的是jemalloc , 我也假定他们在Linux上运行。 jemalloc的manpage说它总是比sbrk()更喜欢mmap() sbrk() 。

现在, jemalloc唯一的mmap()调用使用标志MAP_PRIVATE | MAP_ANONYMOUS MAP_PRIVATE | MAP_ANONYMOUS偶尔包含MAP_FIXED ,特别是它不使用MAP_UNINITIALIZED 。 这意味着页面在分配时总是被初始化 。

此外,对于匿名映射,即使madvise()和MADV_DONTNEED也会为匿名映射返回“零填充点播页面” ,我将其称为“零初始化页面”。

串口ReadFile读取0个字节并返回true

如何在Ubuntu Linux启动时运行Java应用程序

如何find全局静态初始化

关于init_task(pid 0或pid 1?)的困惑

如何在Linux上初始化一个共享库

我的问题是:第二次读取会返回非零值,导致错误

使用memset等结构初始化({…})是否可以吗?

初始化模块在Apache2

运行自定义init:无法产生主页主进程:无法执行:没有这样的文件或目录

将Linux引导选项传递给Init

Windows中的Python h2o:无法初始化(TypeError:“nonetype”types的参数不可迭代)

无论这个家伙提供什么解释,都是完全失败的(至少在给定的情况下)。 而且代码有不确定的行为。

如果data指向至少以size() + 1大小分配的块,则代码由于竞争条件而具有未定义的行为(他提到之前使用线程)。

如果data的大小小于这个值(例如等于size() ),那么由于出界限制访问(并且争用条件成为一个争议点),代码具有未定义的行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐