Nightly build from 2022-05-16-02-41-35
Übersetzung (Google):
Das Verschieben nach links um einen Betrag, der größer oder gleich der Breite des Typs ist, ist sowohl in C als auch in C++ nicht definiert. Dies konnte in BitStreamWriter passieren, wenn m_bitWrited Null war, und führte zu inkonsistenten Ergebnissen zwischen Intel- und ARM-Zielen.
Auf Intel wird die Menge der zu verschiebenden Bits explizit auf die unteren 5 (für 32-Bit-Werte) oder 6 (für 64-Bit-Werte) Bits maskiert. Dies ist in der Befehlssatzreferenz dokumentiert. Tatsächlich ist die Menge der zu verschiebenden Bits die tatsächliche Menge modulo 32 oder 64. In diesem speziellen Fall ließ die Aufforderung an die CPU, um 32 Bits zu verschieben, den Wert unverändert.
ARM stellt keine Anforderungen an das Verhalten der CPU, wenn der zu verschiebende Betrag größer als 32/64 ist - die Befehlssatzreferenz sagt nur, dass das Register "einen Verschiebungsbetrag von 0 bis 31 in seinen unteren 5 halten soll Stückchen.". Die MSVC-Dokumentation legt jedoch nahe, dass Werte in Registern möglicherweise "umlaufen", wenn sie um mehr als 32 oder 64 Bit verschoben werden, was hier tatsächlich beobachtet wurde.
Der Fix läuft im Wesentlichen darauf hinaus, das Intel-Verhalten zu emulieren (da es die ursprüngliche Entwicklungsplattform war und vermutlich die meisten Annahmen im Hinblick darauf gemacht wurden, wenn auch unwissentlich), indem der Wert nicht berührt wird, wenn die Anzahl der zu verschiebenden Bits 32 beträgt.