从非初始化的内存中读取每次都会返回不同的答案
Reading from uninitialized memory returns different answers every time
在尼古拉斯·奥尔莫德(Nicholas Ormrod)在CPPCON 2016上的演讲中,他在Facebook上提到了一个阴险的错误,其中一个单个字节是从一个非传统的(未编写的)页面中读取的,两次第二个读取返回的(非零)值与第一个读取值不同(零)。
他提到他们使用了 jemalloc ,我也认为他们在Linux上运行。Jemalloc的Manpage说,它总是比mmap()
更喜欢sbrk()
。
现在,Jemalloc的唯一mmap()
呼叫使用偶尔包含MAP_FIXED
的标志MAP_PRIVATE | MAP_ANONYMOUS
,尤其是不使用MAP_UNINITIALIZED
。这意味着分配时页面总是为零。
此外,即使是带有MADV_DONTNEED
的madvise()
,对于匿名映射,也将返回匿名映射的"零填充"页面"零填充页面",我将其读为"零无定位的页面"。
我的问题是:第二读如何返回非零值,导致其错误?
这些家伙提供的解释是完全破坏的(至少在给定的上下文中)。并且该代码无论如何都有不确定的行为。
如果data
指向至少size()
1大小分配的块,则该代码由于种族条件而具有未定义的行为(他以前提到了线程的用法)。
如果data
的大小小于(例如,等于size()
),则代码由于范围访问而没有定义的行为(并且种族条件变成了MOOT点)。
相关文章:
- 为什么C++程序在太大时返回代码而不是答案?
- 函数从指针 c++ 中获取错误的值并返回错误的答案
- set_difference并不总是返回正确的答案
- 阶乘函数只返回C++中输入的答案
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 静态分配和动态分配返回不同的答案
- 无法将答案从矢量返回到整数
- 基础数学没有返回正确答案
- 为什么返回语句和打印语句返回不同的答案?
- std::string::find 返回错误的答案
- 我想将字符串转换为 Json 格式并返回字符串向量作为答案
- 为什么我的函数返回一个整数,尽管我已经将答案指定为浮点数
- 用于获取以元音和辅音开头的单词数量的程序返回错误的答案
- 我正在尝试编写一个简单的计算程序,但答案一直返回为 0
- 从非初始化的内存中读取每次都会返回不同的答案
- C++ - 整数除以整数返回错误答案
- 具有基本结构的结构数组返回错误的答案
- 奇怪的功能行为C ,没有返回相同的答案
- 无法计算如何从联机答案中返回c++函数的多个值
- 0-1整数背包返回错误答案(动态编程)