2012-10-19 14 views
5

Tôi vừa tải xuống các nguồn để nén LZ4-HC và kiểm tra tính tương thích 64-bit.Mã nguồn cho LZ4 nén 64-bit có tương thích không?

I'am nhận được vài cảnh báo "chuyển đổi từ '__int64' thành 'int unsigned', mất dữ liệu"

Khi tôi tiếp tục đào sâu tôi nhận thấy ADD_HASH vĩ mô (p). Phần cuối cùng của macro là

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) 

gì đang xảy ra trên 32 bit - chúng ta trừ const int từ con trỏ và lưu trữ vào một con trỏ - đủ an toàn.

Bây giờ 64: Dường như với tôi rằng việc trừ hai con trỏ trên 64 và lưu chúng vào U32 là không an toàn chút nào!

Sự hiểu biết của tôi rằng LZ4 chỉ tương thích 64 bit nếu được đảm bảo rằng "p" và "cơ sở" không cách xa nhau ... và bây giờ tôi phải tìm hiểu sâu hơn về logic để kiểm tra điều đó.

Tôi có bỏ lỡ bất kỳ điều gì không? Có ai kiểm tra thư viện này để có khả năng tương thích 64-bit đầy đủ như nó được cho là không? Bất kỳ vấn đề khác biết với mã của thư viện?

Trả lời

2

LZ4 được coi là tương thích 64 bit. Nó đã được thử nghiệm nhiều lần rồi.

LZ4-HC phức tạp hơn một chút và có thể có một số cảnh báo trình biên dịch còn lại. Hãy thông báo cho họ về danh sách sự cố: http://code.google.com/p/lz4/issues/list

Độ nền của 2 con trỏ được cho là loại size_t. size_t là 64 bit trên CPU 64 bit. Việc tạo kết quả thành 32 bit do đó có thể tạo ra sự cố tràn.

Tuy nhiên, điều này là khó xảy ra. LZ4 hoạt động trên cửa sổ 64 KB. Có nghĩa là, bất kỳ tham chiếu nào ngoài 64KB đều bị bỏ qua. Đối với một tham chiếu phạm vi rất dài để trở thành vấn đề, nó sẽ cần phải được chính xác 4GB + vài KB. Hơn nữa, vì các tham chiếu được liệt kê, cần có tham chiếu hoàn toàn bằng không giữa < 64KB và> 4GB sử dụng cùng một giá trị băm. Điều này cũng rất khó xảy ra.

Thậm chí sau đó, nếu trường hợp như vậy có thể được cố ý giả mạo, hiệu ứng cuối cùng là máy nén sẽ được "gợi ý" đối với một vị trí không phù hợp. Và sẽ loại bỏ nó khi so sánh hoạt động.

Vì vậy, nhược điểm duy nhất là một nguy cơ mất một vài chu kỳ CPU trên một so sánh vô ích. Khá công bằng.

Tuy nhiên, tốt hơn hết là xóa "cảnh báo trình biên dịch" bất cứ khi nào nó "gần như miễn phí". Hầu như miễn phí được dịch sang: không mất hiệu suất và tác động không đáng kể đến độ phức tạp của mã.

Các vấn đề liên quan