Издаден release 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
