Совместим ли исходный код для сжатия LZ4 с 64-битной версией?

Я только что скачал исходники для сжатия 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

Предполагается, что вычитание двух указателей имеет тип size_t. size_t составляет 64 бита на 64-битном процессоре. Таким образом, преобразование результата в 32-битное может создать проблему переполнения.

Однако это маловероятно. LZ4 работает в окне размером 64 КБ. Это означает, что любая ссылка за пределами 64 КБ игнорируется. Чтобы ссылка на очень большой диапазон стала проблемой, она должна быть ровно 4 ГБ + несколько КБ. Кроме того, поскольку ссылки перечислены, необходимо, чтобы между ‹ 64 КБ и > 4 ГБ с использованием одного и того же хэша не было абсолютно нулевой ссылки. Это тоже крайне маловероятно.

Даже в этом случае, если такой случай может быть преднамеренно подделан, конечным эффектом будет то, что компрессор будет «намечен» на позицию, которая не соответствует. И отбросит его при операции сравнения.

Так что единственный минус — это риск потерять несколько тактов ЦП на бесполезное сравнение. Вполне справедливо.

Тем не менее, всегда лучше удалять «предупреждения компилятора», когда это «почти бесплатно». Практически бесплатный перевод на : без потери производительности и незначительного влияния на сложность кода.

person Cyan    schedule 20.10.2012