ZXC 0.9.0

Состоялся выпуск 0.9.0 библиотеки и кроссплатформенной консольной утилиты ZXC (github.com), реализующих высокопроизводительное многопоточное асимметричное сжатие без потерь и оптимизированное для игровых ресурсов, прошивок и пакетов приложений. Формат разработан по принципу «один раз записать, многократно читать» (WORM).
В отличие от таких кодеков, как LZ4, ZXC жертвует скоростью сжатия ради максимальной пропускной способности при распаковке.
Декларируется скорость распаковки на 40%+ выше, чем у LZ4 на Apple Silicon, на 25%+ выше на Google Axion (ARM64) и на 5%+ выше на x86_64, при этом во всех случаях обеспечивается более высокий коэффициент сжатия.
В этом выпуске представлен API многократно используемого контекста, возможность настройки размера блоков, полное справочное руководство по API и ABI, а также несколько исправлений, связанных с безопасностью, в том числе устранение уязвимости переполнения буфера в куче, обнаруженной в ходе фаззинга модуля сжатия.
Версия SOVERSION увеличена до 2: данный релиз содержит изменения, нарушающие ABI.
Проект написан на языке 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.
>>> Подробности на GitHub
