Изходният код за LZ4 компресия 64-bit съвместим ли е?

Току-що изтеглих източници за LZ4-HC компресия и го проверявам за 64-битова съвместимост.

Получавам няколко предупреждения „преобразуване от „__int64“ в „unsigned int“, възможна загуба на данни“

Когато продължих да ровя, забелязах макрос ADD_HASH(p). Последната част от този макрос е

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)

Какво се случва на 32 бита - изваждаме const int от указателя и съхраняваме в друг указател - достатъчно безопасно.

Сега 64: Струва ми се, че изваждането на два указателя на 64 и запазването им в U32 изобщо не е безопасно!

Разбирам, че LZ4 е 64-битов съвместим само ако се гарантира, че "p" и "base" не са далеч едно от друго... и сега трябва да се заровя по-дълбоко в логиката, за да проверя това.

Пропуснах ли нещо? Някой провери ли тази библиотека за пълна 64-битова съвместимост, както се твърди? Някакви други познати проблеми с кода на библиотеката?


person adspx5    schedule 19.10.2012    source източник


Отговори (1)


Предполага се, че LZ4 е 64-битов съвместим. Вече е тестван многократно.

LZ4-HC е малко по-сложен и може би са останали някои предупреждения на компилатора. Чувствайте се свободни да ги уведомите в списъка с проблеми: http://code.google.com/p/lz4/issues/list

Предполага се, че изваждането на 2 указателя е тип size_t. size_t е 64 бита на 64 бита CPU. Следователно прехвърлянето на резултата към 32 бита може да създаде проблем с препълване.

Това обаче е малко вероятно. LZ4 работи на 64 KB прозорец. Което означава, че всяка препратка над 64KB се пренебрегва. За да стане справка с много дълъг обхват проблем, тя трябва да бъде точно 4GB + няколко KB. Освен това, тъй като референциите са изброени, е необходимо да има абсолютно нулева референция между ‹ 64 KB и > 4 GB, използвайки един и същ хеш. Това също е изключително малко вероятно.

Дори тогава, ако такъв случай може да бъде умишлено фалшифициран, крайният ефект е, че компресорът ще бъде "намекан" към позиция, която не съответства. И ще го отхвърли при операция за сравнение.

Така че единственият недостатък е рискът да загубите няколко цикъла на процесора при безполезно сравнение. Съвсем справедливо.

Независимо от това, винаги е по-добре да премахнете "предупрежденията на компилатора", когато е "почти безплатно". Почти безплатно се превежда на: без загуба на производителност и незначително въздействие върху сложността на кода.

person Cyan    schedule 20.10.2012