2012-10-19 16 views
5

私はLZ4-HC圧縮のソースをダウンロードし、64ビット互換性をチェックしました。LZ4圧縮のソースコードは64ビット互換ですか?

私が掘りに保持すると、いくつかの警告を取得I'am " 'unsigned int型' から '__int64' からの変換を、データの損失の可能性"

は、私はマクロADD_HASH(p)を気づきました。そのマクロの最後の部分は32ビットで何が起こっている

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) 

ある - 十分に安全 - 私たちは別のポインタにポインタと保存からのconst int型を引きます。

今すぐ64: 64に2つのポインタを差し引いてU32に保存することは、まったく安全ではありません。

"p"と "base"が遠く離れていないことが保証されている場合に限り、LZ4は64ビット互換ですが、今ではそれを確認するロジックを深く掘り下げなければなりません。

私は何かを見逃しましたか?誰かが完全な64ビット互換性についてこのライブラリをチェックしていたのですか?ライブラリのコードに関するその他の既知の問題

答えて

2

LZ4は64ビット互換であると想定されています。すでに何度もテストされています。

LZ4-HCはもう少し複雑で、コンパイラの警告が残っている可能性があります。 問題リストに気軽にご連絡ください:http://code.google.com/p/lz4/issues/list

2つのポインタの減算は、size_t型であると考えられます。 size_tは64ビットCPUで64ビットです。 結果を32ビットにキャストすると、オーバーフローの問題が発生する可能性があります。

これはほとんどありません。 LZ4は64 KBのウィンドウで動作します。つまり、64KBを超える参照は無視されます。問題となる非常に長い範囲の参照を正確に4GB +数KBにする必要があります。 さらに、参照が列挙されているので、同じハッシュを使用して、< 64KBと> 4GBの間に絶対的にゼロ参照があることが必要です。これはまた非常にありそうもありません。

そのような場合でも、意図的に偽造することができた場合、コンプレッサーはマッチしない位置に向かって「ヒント」されることになります。比較操作でそれを破棄します。

唯一の欠点は、無駄な比較で数CPUサイクルを失う危険があることです。かなり公平です。

しかし、「ほぼ自由」なときはいつでも「コンパイラの警告」を削除する方が良いです。ほぼ自由に翻訳されます:パフォーマンスの損失なし、コードの複雑さへの影響はごくわずかです。

関連する問題