ZXC 0.9.0

good-penguin.png

Состоялся выпуск 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.
  • Настраиваемые размеры блоков:
    • размер блока теперь можно настроить с помощью поля 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

©  Linux.org.ru