gibt es Millionen von kleinen Bugs rund um uns herum, was auch immer von unseren Desktop-Anwendungen zu den Geräten in der Küche ist. Verborgene, willkürliche Bedingungen, die unbeabsichtigte Ausgänge sowie Verhaltensweisen verursachen. Es gibt viele Methoden, um diese Fehler zu ermitteln, jedoch eine Methode, die wir nicht extrem häufig hören, einen Fehler in Ihrem eigenen Code entdeckt, nur um zu erkennen, dass jemand anderes den gleichen Fehler gemacht hat. Zum Beispiel entdeckte [David Buchanan] einen Fehler in seinem Multi-Thread-PNG-Decodierer sowie realisierte, dass der Apple PNG-Decoder den gleichen Fehler hatte.
PNG (tragbare Netzwerkgrafiken) ist ein Bildstil wie JPEG, WEBP oder TIFF, der Gifs ersetzt wird. Nach einem Header ist der Rest der Daten vollständig Brocken. Jeder Chunk wird von einem vierstufigen Kennung vorangetrieben, wobei ein paar Teile wichtige Stücke sind. Die erforderlichen Abschnitte sind IHDR (den Header), IDAT (tatsächliche Bilddaten), plte (die Kombinationsinformationen) sowie IEND (der letzte Chunk in der Datei). Die Kompression erfolgt über die in ZLIB verwendeten Deflat-Technik, die von Natur aus seriell ist. Wenn Sie interessiert sind, gibt es ein praktisches Poster über den Stil von einer ausgezeichneten Ressource, die wir eine Weile abgedeckt haben.
In Anbetracht der Defrat ist inhärent seriell, es ist schwierig, die Daten in der Regel zu stylen. [DAVID] Zusätzliche spezielle Abschnitte namens PLLD-Abschnitte (der Kleinbuchstabe sehr erster Buchstabe bedeutet, dass es von Decoder sicher ignoriert werden kann, die es nicht unterstützen). Diese Abschnitte lassen den Decoder verstehen, dass ein bereitgestelltes Idat-Chunk sicherlich gleichzeitig in X-Teile deserialisiert werden kann. Apple verwendet eine ähnliche Technik mit seinen Idot-Brocken. Hier gibt es jedoch ein Problem. Es ist möglich für Dekompression (A + B)! = Decompress (A) + Decompress (B), wenn ein Ende der Hälfte mit einem nicht komprimierten Block endet. Da die Deflat-Technik ein Fenster verwendet, können zwei Abschnitte zusammen miteinander eingestellt werden.
Da es jetzt zwei mögliche Interpretationen eines mitgelieferten PNG gibt, können Sie ein PNG zusammenstellen, um sicherzustellen, dass er, wenn sie seriell dekodiert ist, ein Bild zeigt, und wenn sie parallel dekodiert ist, zeigt es ein anderes. Zusätzlich entdeckte [DAVID] einen Rennzustand in der Desktop-Safari, der jedes Mal zu einem etwas unterschiedlichen Bild entgab. Hier ist das PNG, das jeden Rahmen dekodiert wird:
[DAVID] komponierte ein Bit-Werkzeug auf Github, um zwei Bilder in ein PNG zu packen. Es erinnert uns an die alte Technik-Steganographie, wo Trickdaten in einem Bild versteckt wurden.
(Headerbild mit freundlicher Genehmigung von [Paweldecowski]).