Току-що изтеглих източници за 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-битова съвместимост, както се твърди? Някакви други познати проблеми с кода на библиотеката?