Izdan je 0.9.0 verzija biblioteke i multiplatformske konzolne alatke ZXC (github.com), koja implementira visoko performansno višedretveno asimetrično kompresiranje bez gubitaka, optimizirano za igre, firmware i pakete aplikacija. Format je razvijen prema principu "jednom zapiši, više puta čitaj" (WORM).
Za razliku od kodeka kao što je LZ4, ZXC žrtvuje brzinu kompresije radi maksimalne propusnosti pri dekompresiji.
Deklarira se brzina dekompresije koja je 40% brža od LZ4 na Apple Silicon, 25% brža na Google Axion (ARM64) i 5% brža na x86_64, pri čemu se u svim slučajevima osigurava viši koeficijent kompresije.
Ovo izdanje uključuje API za višekratnu upotrebu konteksta, mogućnost podešavanja veličine blokova, potpuno uputstvo za API i ABI, kao i nekoliko popravki povezanih sa sigurnošću, uključujući uklanjanje ranjivosti prelivanja bafera u hrpi, koja je otkrivena tokom fuzzinga modula za kompresiju.
Ovo izdanje sadrži promene koje krše ABI, pa je SOVERSION povećan na 2.
Projekt je napisan u C jeziku i distribuira se pod BSD 3 licencom.
Detalji
- Promene koje dovode do nekompatibilnosti:
- SOVERSION 2: Verzija ABI biblioteke je povećana. Binarni fajlovi kompajlirani pod SOVERSION 1 moraju biti ponovo kompajlirani.
- Strukture opcija: funkcije zxc_compress() i zxc_decompress() sada primaju zxc_compress_opts_t* i zxc_decompress_opts_t* umesto pozicijskih parametara. Za podrazumevano ponašanje prosledite NULL.
- Kodiranje veličine bloka: Datoteka sada čuva veličinu bloka u obliku eksponenta log2 [12..21] umesto ranijeg kodiranja sa dva opsega. Starija vrednost 64 još uvek se prihvata radi unazadne kompatibilnosti.
- Nove mogućnosti:
- Neprozirni konteksti kompresije i dekompresije, alocirani u hrpi, koji eliminišu preopterećenje alokacije memorije pri svakom pozivu; idealni su za sistemske pluginove za datoteke (squashfs, dwarfs) i obradu serija:
- zxc_create_cctx(), zxc_free_cctx() i zxc_compress_cctx() za kompresiju;
- zxc_create_dctx(), zxc_free_dctx() i zxc_decompress_dctx() za dekompresiju;
- interne baferi se prenose samo u slučaju da se vrednost block_size ili level promeni između poziva.
- Neprozirni konteksti kompresije i dekompresije, alocirani u hrpi, koji eliminišu preopterećenje alokacije memorije pri svakom pozivu; idealni su za sistemske pluginove za datoteke (squashfs, dwarfs) i obradu serija:
- Prilagodljive veličine blokova:
- veličina bloka sada se može prilagoditi poljem block_size u strukturi zxc_compress_opts_t;
- dozvoljeni opseg: od 4 KB do 2 MB (stepen dvojke);
- podrazumevano, vrednost ostaje 256 KB;
- novi parametar —block-size (ili -B) dodat je konzolnoj alatki zxc sa podrškom za sufixe jedinica (4K, 1M ili 4KB, 1MB itd.).
- Brza direktna dekompresija:
- kada je destinacijski bafer dovoljno ispunjen, tokom dekompresije preskoči se međusobno kopiranje u radni bafer, što smanjuje opterećenje memorije i smanjuje kašnjenje.
- Sigurnost i stabilnost:
- Ispravljena je greška u prelivanju heap-a u zxc_bitpack_stream_32: petlja za pakovanje mogla je zapisivati do 4 bajta izvan izlaznog bafera ako je poslednja upakovana vrednost prelazila granicu bajta;
- Ispravljena je provera toka prilikom dekompresije (u zxc_decompress.c): dodana je provera koja osigurava da je veličina toka sekvenci dovoljna za navedeni broj sekvenci, što sprečava čitanje van dozvoljenog opsega.
- Provera veličine bloka: sada se u funkcijama zxc_cctx_init() i zxc_read_file_header() vrši provera da li su veličine blokova u opsegu [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] i da su stepeni dvojke;
- Kompatibilnost sa C++: svi javni header-i sada sadrže zaštitne konstrukcije extern "C" za besprekorno korišćenje u C++;
- Skladištenje corpus-a testova za fuzz-testing: postavljeno je trajno skladištenje corpus-a za ClusterFuzzLite CI.
- Dokumentacija:
- docs/API.md: novi sveobuhvatni priručnik za API i ABI, koji opisuje svih 21 eksportovanih simbol, definicije tipova, strategiju vidljivosti, verzionisanje ABI, garancije sigurnosti toka i obrasce obrade grešaka;
- Ažurirani man i README datoteka sa uputstvima za instalaciju i informacijama o statusu paketa (vcpkg, Conan, Homebrew);
- Ažurirana datoteka docs/FORMAT.md sa opisom kodiranja veličine bloka na osnovu eksponencijala.
- Ažurirani wrapper-i za Python, Rust i Node.js.
Izvor: linux.org.ru
