Состоялся выпуск 0.9.0 библиотеки и кроссплатформенной консольной утилиты ZXC (github.com), реализующих высокопроизводительное многопоточное асимметричное сжатие без потерь и оптимизированное для игровых ресурсов, прошивок и пакетов приложений. Формат разработан по принципу «один раз записать, многократно читать» (WORM).
В отличие от таких кодеков, как LZ4, ZXC жертвует скоростью сжатия ради максимальной пропускной способности при распаковке.
Декларируется скорость распаковки на 40%+ выше, чем у LZ4 на Apple Silicon, на 25%+ выше на Google Axion (ARM64) и на 5%+ выше на x86_64, при этом во всех случаях обеспечивается более высокий коэффициент сжатия.
В этом выпуске представлен API многократно используемого контекста, возможность настройки размера блоков, полное справочное руководство по API и ABI, а также несколько исправлений, связанных с безопасностью, в том числе устранение уязвимости переполнения буфера в куче, обнаруженной в ходе фаззинга модуля сжатия.
Данный релиз содержит изменения, нарушающие ABI, поэтому SOVERSION увеличена до 2.
Проект написан на языке C и распространяется по лицензии BSD 3.
Подробности
- Изменения, приводящие к несовместимости:
- SOVERSION 2: Версия ABI библиотеки была увеличена. Бинарные файлы, скомпилированные под SOVERSION 1, необходимо перекомпилировать.
- Структуры опций: функции zxc_compress() и zxc_decompress() теперь принимают zxc_compress_opts_t* и zxc_decompress_opts_t* вместо позиционных параметров. Для поведения по умолчанию передавайте NULL.
- Кодирование размера блока: Заголовок файла теперь хранит размер блока в виде экспоненты log2 [12..21] вместо прежнего кодирования с двумя шкалами. Старое значение 64 по-прежнему принимается для обратной совместимости.
- Новые возможности:
- Непрозрачные контексты сжатия и распаковки, выделяемые в куче, которые устраняют накладные расходы на выделение памяти при каждом вызове; идеально подходят для плагинов файловой системы (squashfs, dwarfs) и пакетной обработки:
- zxc_create_cctx(), zxc_free_cctx() и zxc_compress_cctx() для компресии;
- zxc_create_dctx(), zxc_free_dctx() и zxc_decompress_dctx() для декомпресии;
- внутренние буферы перераспределяются только в том случае, если между вызовами изменяется значение block_size или level.
- Непрозрачные контексты сжатия и распаковки, выделяемые в куче, которые устраняют накладные расходы на выделение памяти при каждом вызове; идеально подходят для плагинов файловой системы (squashfs, dwarfs) и пакетной обработки:
- Настраиваемые размеры блоков:
- размер блока теперь можно настроить с помощью поля block_size в структуре zxc_compress_opts_t;
- допустимый диапазон: от 4 КБ до 2 МБ (степень двойки);
- по умолчанию значение остается 256 КБ;
- в консольную утилиту zxc добавлен новый параметр —block-size (или -B) с поддержкой суффиксов единиц измерения (4K, 1M или 4KB, 1MB и т. д.).
- Быстрая прямая декомпрессия:
- когда буфер назначения достаточно заполнен, при распаковке пропускается промежуточное копирование в рабочий буфер, что позволяет снизить нагрузку на память и сократить задержку.
- Безопасность и стабильность:
- исправлено переполнение буфера кучи в zxc_bitpack_stream_32: цикл упаковки мог записывать до 4 байтов за пределы выходного буфера, если последнее упакованное значение пересекало границу байта;
- исправлена проверка потока при распаковке (в zxc_decompress.c): добавлена проверка, гарантирующая, что размер потока последовательностей достаточен для заявленного количества последовательностей, что предотвращает чтение за пределами допустимого диапазона.
- проверка размера блока: теперь в функциях zxc_cctx_init() и zxc_read_file_header() выполняется проверка, что размеры блоков находятся в диапазоне [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] и они являются степенями двойки;
- совместимость с C++: все публичные заголовочные файлы теперь содержат защитные конструкции extern "C" для беспроблемного использования в C++;
- хранение корпуса тестов для фаззинг-тестирования: настроено постоянное хранилище корпуса для ClusterFuzzLite CI.
- Документация:
- docs/API.md: новый исчерпывающий справочник по API и ABI, в котором описаны все 21 экспортируемый символ, определения типов, стратегия видимости, версионирование ABI, гарантии потокобезопасности и шаблоны обработки ошибок;
- обновлены man и файл README с инструкциями по установке и информацией о статусе пакетов (vcpkg, Conan, Homebrew);
- обновлён файл docs/FORMAT.md с описанием кодирования размера блока на основе экспоненты.
- Обновлены врапперы для Python, Rust и Node.js.
Աղբյուր: linux.org.ru
