Izšel je 0.9.0 različica knjižnice in večplatformske konzole. ZXC (github.com), ki implementira visokozmogljivo večnitno asimetrično stiskanje brez izgube in optimizirano za igre, vgrajene programske opreme in aplikacijske pakete. Format je zasnovan po načelu 'enkratni zapis, večkratno branje' (WORM).
V nasprotju s kodiki, kot je LZ4, ZXC žrtvuje hitrost stiskanja za maksimalno propustnost pri razpakiranju.
Hitrost razpakiranja naj bi bila 40 % + višja kot pri LZ4 na Apple Silicon, 25 % + višja na Google Axion (ARM64) in 5 % + višja na x86_64, pri čemer je v vseh primerih dosežen višji koeficient stiskanja.
Ta različica predstavlja API za večkratno uporabo konteksta, možnost nastavitve velikosti blokov, popoln referenčni priročnik za API in ABI ter več popravkov v zvezi z varnostjo, vključno z odpravo ranljivosti prelivanja v pomnilniku, ugotovljene med fuzz testiranjem modula za stiskanje.
Ta izdanek vsebuje spremembe, ki motijo ABI, zato je SOVERSION povečana na 2.
Projekt je napisan v jeziku C in je licenciran pod BSD 3 licenco.
Podrobnosti
- Spremembe, ki privedejo do nezdružljivosti:
- SOVERSION 2: Različica ABI knjižnice je bila povečana. Priročniki, skompilirani pod SOVERSION 1, morajo biti ponovno skompilirani.
- Strukture možnosti: funkciji zxc_compress() in zxc_decompress() zdaj sprejemata zxc_compress_opts_t* in zxc_decompress_opts_t* namesto pozicijskih parametrov. Za privzeto vedenje posredujte NULL.
- Kodiranje velikosti bloka: Zavihek datoteke zdaj hrani velikost bloka v obliki eksponenta log2 [12..21] namesto prejšnjega kodiranja z dvema lestvicama. Stara vrednost 64 se še vedno sprejema za nazaj kompatibilnost.
- Nove mogućnosti:
- Neprozorni konteksti za stiskanje in razpakiranje, dodeljeni v pomnilniku, ki odpravljajo stroške dodeljevanja pomnilnika pri vsakem klicu; idealni so za vtičnike datotečnega sistema (squashfs, dwarfs) in serijsko obdelavo:
- zxc_create_cctx(), zxc_free_cctx() in zxc_compress_cctx() za stiskanje;
- zxc_create_dctx(), zxc_free_dctx() in zxc_decompress_dctx() za razpakiranje;
- notranji mehurčki so ponovno dodeljeni le, če se med klici spremeni vrednost block_size ali level.
- Neprozorni konteksti za stiskanje in razpakiranje, dodeljeni v pomnilniku, ki odpravljajo stroške dodeljevanja pomnilnika pri vsakem klicu; idealni so za vtičnike datotečnega sistema (squashfs, dwarfs) in serijsko obdelavo:
- Nastavljive velikosti blokov:
- velikost bloka je zdaj mogoče nastaviti s poljem block_size v strukturi zxc_compress_opts_t;
- dovoljen obseg: od 4 KB do 2 MB (stopnja dvojice);
- privzeta vrednost ostaja 256 KB;
- v konzolno orodje zxc je dodana nova možnost -block-size (ali -B) s podporo za enote merjenja (4K, 1M ali 4KB, 1MB itd.).
- Hitra neposredna razpakira:
- ko je ciljna predpomnilnik dovolj napolnjen, se med razpakiranjem izogne posrednemu kopiranju v delovni pomnilnik, kar zmanjša obremenitev pomnilnika in zmanjša zakasnitve.
- Varnost in stabilnost:
- popravljen je napuh boljega pomnilnika v zxc_bitpack_stream_32: krog pakiranja je lahko zapisoval do 4 bajte zunaj izhodnega pomnilnika, če je zadnja pakirana vrednost presegla mejo bajta;
- popravljen pregled toka pri razpakiranju (v zxc_decompress.c): dodana je bila preverba, ki zagotavlja, da je velikost toka zaporedij zadostna za navedeno število zaporedij, kar preprečuje branje zunaj dovoljene meje.
- pregled velikosti bloka: zdaj v funkcijah zxc_cctx_init() in zxc_read_file_header() izvedemo preverbo, da so velikosti blokov v razponu [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] in so potence števila 2;
- združljivost s C++: vsi javni glavni datoteki zdaj vsebujejo zaščitne konstrukcije extern "C" za brez težav uporabo v C++;
- shranjevanje testnih primerov za fuzijsko testiranje: nastavljen je trajni repozitorij testnih primerov za ClusterFuzzLite CI.
- Dokumentacija:
- docs/API.md: nov izčrpen priročnik za API in ABI, ki opisuje vseh 21 izvoženih simbolov, definicije tipov, strategijo vidnosti, verzioniranje ABI, jamstva za varnost niti in predloge za obvladovanje napak;
- posodobljeni so bili man in datoteka README z navodili za namestitev in informacijami o statusu paketov (vcpkg, Conan, Homebrew);
- posodobljena datoteka docs/FORMAT.md s opisom kodiranja velikosti bloka na osnovi eksponentov.
- posodobljeni ovojčki za Python, Rust in Node.js.
Izvor: linux.org.ru
