Nicholas Ormrod's talkでCppCon 2016で、彼はFacebookで面倒なバグを書きましたが、ここでは初期化されていない(未書き込みの)ページから2バイト2回目の読み取りは最初の読み取り値(ゼロ)とは異なる値(非ゼロ)を返しました。初期化されていないメモリからの読み込みは、毎回異なる回答を返す
彼は、彼らがLinuxで動作していたjemallocとI also presumeを使用していると述べました。 jemalloc's manpageは、sbrk()
よりも常にmmap()
が好きだと言います。
ここで、jemalloc's only mmap()
callは、フラグMAP_PRIVATE | MAP_ANONYMOUS
を時折含めてMAP_FIXED
を使用し、特にMAP_UNINITIALIZED
を使用しません。これは、割り当てられたときにページがalways zero-initializedであることを意味します。
さらに、madvise()
with MADV_DONTNEED
でも、匿名マッピングの場合は、匿名マッピングの場合は"zero-fill-on-demand pages"を返します。これは「ゼロ初期化ページ」と読みます。
私の質問は次のとおりです。2番目の読み込みでゼロ以外の値が返され、バグが発生する可能性はありますか?
Nicholasのバグは、ページが条件付きでカーネルに返されたときに発生するので、ページからバイトを読み込むと、カーネルは初期化されていないメモリを返しているので、「0」を返します。しかし、2回目の読み込みでは、読み込みの代わりに*書く*ので、カーネルは実際にメモリが必要であることを認識し、そこに格納されている実際のデータを取得します – Justin
この質問は質問に答えるのに十分なコンテキストを提供しません。それは[mcve]が欠けている。この質問に答えるために、回答者はビデオを見る必要があります – Justin
@ジャスティン私は追加情報のビデオにリンクしましたが、ここでバグのすべての詳細を述べました。 –