In Nicholas Ormrod's talk auf der CppCon 2016 erwähnte er einen heimtückischen Bug bei Facebook, wo ein einzelnes Byte von einer nicht initialisierten (ungeschriebenen) Seite zweimal gelesen wurde, so dass es Fälle gab Der zweite Lesevorgang hat einen (von Null verschiedenen) Wert zurückgegeben, der sich vom ersten Lesewert (Null) unterscheidet.Das Lesen von nicht initialisiertem Speicher gibt jedesmal unterschiedliche Antworten zurück
Er erwähnte, dass sie jemalloc und I also presume sie unter Linux ausgeführt wurden. jemalloc's manpage sagt, dass es immer mmap()
über sbrk()
bevorzugt.
Nun jemalloc's only mmap()
call verwendet die Fahnen MAP_PRIVATE | MAP_ANONYMOUS
mit der gelegentlichen Aufnahme von MAP_FIXED
, und insbesondere ist es nicht MAP_UNINITIALIZED
verwenden. Dies bedeutet, dass die Seiten always zero-initialized zugewiesen sind.
Darüber hinaus wird auch madvise()
with MADV_DONTNEED
, für anonyme Zuordnungen, "zero-fill-on-demand pages" für anonyme Zuordnungen zurückgeben, die ich als "zero-initialisierte Seiten."
Meine Frage ist: Wie ist es möglich, dass die zweite Lesung jemals einen Wert ungleich Null zurückgeben würde, was ihren Fehler verursacht?
Um das Video zu paraphrasieren: der Fehler Nicholas beschreibt passiert, wenn eine Seite bedingt zum Kernel zurückgegeben wird. Wenn Sie also das Byte von der Seite lesen, sagt der Kernel, es ist nicht initialisiert Speicher, so dass es 0 zurückgeben kann. Im zweiten Lesevorgang schreiben Sie jedoch * anstatt * zu lesen, damit der Kernel erkennt, dass Sie tatsächlich den Speicher benötigen und die tatsächlich dort gespeicherten Daten abrufen. – Justin
Diese Frage bietet nicht genügend Kontext, um die Frage beantworten zu können. Es fehlt ein [mcve]. Um diese Frage zu beantworten, müssten die Beantworter das Video – Justin
@Justin ansehen, das ich mit dem Video für zusätzliche Informationen verlinkt habe, aber ich habe hier alle Details des Fehlers erwähnt. –