2012-10-19 3 views
5

Ich habe gerade Quellen für LZ4-HC-Komprimierung heruntergeladen und überprüft auf 64-Bit-Kompatibilität.Ist der Quellcode für die LZ4-Komprimierung 64-Bit-kompatibel?

Ich bin einige Warnungen "Konvertierung von '__int64' auf 'unsigned int', möglichen Datenverlust" getting

Als ich graben hielt ich Makro ADD_HASH bemerkt (p). Der letzte Teil dieses Makro ist

HashTable[HASH_VALUE(p)] = (p) - base; 

p - const BYTE* 
base - const BYTE* const for 64-bit. (const int b - for 32-bit) 
HTYPE HashTable[]; 
HTYPE is U32 for 64-bit platform  (const BYTE* - for 32-bit) 

Was auf 32-Bit geschieht - sicher genug - wir const int von Zeiger und Speichern in einen anderen Zeiger subtrahieren.

Jetzt 64: Es sieht für mich so aus, dass das Subtrahieren von zwei Zeigern auf 64 und das Speichern in U32 überhaupt nicht sicher ist!

Ich verstehe, dass LZ4 64-Bit-kompatibel ist, nur wenn garantiert, dass "p" und "base" nicht weit voneinander entfernt sind ... und jetzt muss ich tiefer in die Logik eindringen, um das zu überprüfen.

Habe ich etwas übersehen? Hat jemand diese Bibliothek auf volle 64-Bit-Kompatibilität überprüft, wie es behauptet? Irgendwelche anderen Probleme mit dem Code der Bibliothek?

Antwort

2

LZ4 soll 64-Bit-kompatibel sein. Es wurde bereits mehrfach getestet.

LZ4-HC ist ein bisschen komplexer, und vielleicht gibt es einige Compiler-Warnungen. Fühlen Sie sich frei, sie in der Problemliste zu benachrichtigen: http://code.google.com/p/lz4/issues/list

Die Subtraktion von 2 Zeigern soll ein size_typ sein. size_t ist 64 Bits auf 64-Bit-CPU. Wenn das Ergebnis auf 32 Bit umgesetzt wird, kann dies zu einem Überlaufproblem führen.

Dies ist jedoch unwahrscheinlich. LZ4 arbeitet auf 64 KB Fenster. Das heißt, jede Referenz über 64 KB wird ignoriert. Für eine sehr lange Bereichsreferenz, die in Frage kommt, müsste sie genau 4 GB + einige KB betragen. Darüber hinaus, da Referenzen aufgeführt sind, ist es notwendig, dass es absolut Null Referenz zwischen < 64 KB und> 4 GB mit dem gleichen Hash ist. Dies ist auch äußerst unwahrscheinlich.

Selbst wenn ein solcher Fall absichtlich gefälscht werden sollte, ist der Endergebnis, dass der Kompressor in Richtung einer Position "angedeuted" wird, die nicht übereinstimmt. Und wird es bei der Vergleichsoperation ablegen.

Der einzige Nachteil ist ein Risiko, ein paar CPU-Zyklen auf einen nutzlosen Vergleich zu verlieren. Ziemlich fair.

Nichtsdestotrotz ist es immer besser, "Compilerwarnungen" zu entfernen, wenn es "fast frei" ist. Fast kostenlos wird übersetzt in: kein Leistungsverlust und vernachlässigbare Auswirkungen auf die Komplexität des Codes.

Verwandte Themen