Lansering av biblioteket og plattformuavhengig kommandolinjeverktøy versjon 0.9.0. ZXC (github.com), som implementerer høyytelses multitråding asymmetrisk komprimering uten tap og optimalisert for spillressurser, fastvare og programvarepakker. Formatet er utviklet etter prinsippet «skrive én gang, lese mange» (WORM).
I motsetning til kodeker som LZ4 ofrer ZXC komprimeringshastigheten for maksimal båndbredde under dekomprimering.
Den deklarerte dekomprimeringshastigheten er 40%+ høyere enn LZ4 på Apple Silicon, 25%+ høyere på Google Axion (ARM64), og 5%+ høyere på x86_64, samtidig som det i alle tilfeller oppnås en høyere komprimeringsratio.
Denne utgivelsen presenterer et API for gjenbrukbare kontekster, muligheten til å tilpasse størrelsen på blokkene, en komplett API- og ABI-referanseguide, samt flere sikkerhetsrelaterte fikser, inkludert avhjelpning av en bufferoverflow-sårbarhet oppdaget under fuzzing av komprimeringsmodulen.
Denne utgivelsen inneholder endringer som bryter ABI, så SOVERSION er økt til 2.
Prosjektet er skrevet i C og distribueres under BSD 3-lisensen.
Detaljer
- Endringer som resulterer i inkompatibilitet:
- SOVERSION 2: ABI-versjonen på biblioteket er økt. Binær filer som er kompilert for SOVERSION 1, må recompiles.
- Alternativsstrukturer: funksjonene zxc_compress() og zxc_decompress() tar nå zxc_compress_opts_t* og zxc_decompress_opts_t* i stedet for posisjonelle parametere. For standard oppførsel, send NULL.
- Blokka størrelse koding: Filhodet lagrer nå blokkstørrelsen som en eksponent log2 [12..21] i stedet for den tidligere kodingen med to skalaer. Den gamle verdien 64 aksepteres fortsatt for bakoverkompatibilitet.
- Nye funksjoner:
- Ugjennomsiktige komprimerings- og dekomprimeringskontekster allokert på heapen, som eliminerer minnedelingsoverhead ved hver invokasjon; ideelt for filsystem-plugins (squashfs, dwarfs) og batchprosessering:
- zxc_create_cctx(), zxc_free_cctx() og zxc_compress_cctx() for komprimering;
- zxc_create_dctx(), zxc_free_dctx() og zxc_decompress_dctx() for dekomprimering;
- interne buffere realokeres kun hvis verdien block_size eller level endres mellom kall.
- Ugjennomsiktige komprimerings- og dekomprimeringskontekster allokert på heapen, som eliminerer minnedelingsoverhead ved hver invokasjon; ideelt for filsystem-plugins (squashfs, dwarfs) og batchprosessering:
- Konfigurerbare blokkstørrelser:
- blokkerstørrelsen kan nå konfigureres ved å bruke feltet block_size i strukturen zxc_compress_opts_t;
- gyldig område: fra 4 KB til 2 MB (to potens);
- standardverdi er fortsatt 256 KB;
- den konsollverktøyet zxc har fått et nytt parameter —block-size (eller -B) med støtte for enhetssuffikser (4K, 1M eller 4KB, 1MB osv.).
- Rask direkte dekomprimering:
- når målbufferen er tilstrekkelig fylt, hoppes mellomlagring i arbeidsbufferen over ved dekomprimering, noe som reduserer minnebelastningen og reduserer forsinkelsen.
- Sikkerhet og stabilitet:
- fikset heap buffer overflow i zxc_bitpack_stream_32: pakke-loop kunne skrive opptil 4 bytes utenfor utdata-bufferen hvis den sist pakkede verdien krysset bytegrensen;
- fikset strømkontroll ved dekomprimering (i zxc_decompress.c): lagt til sjekk som garanterer at størrelsen på sekvensstrømmen er tilstrekkelig for det angitte antallet sekvenser, som forhindrer lesing utenfor det tillatte området.
- sjekk av blokkstørrelse: nå i funksjonene zxc_cctx_init() og zxc_read_file_header() sjekkes det at blokkene ligger innenfor området [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] og at de er potenser av to;
- kompatibilitet med C++: alle offentlige headerfiler inneholder nå beskyttelseskonstruksjoner extern "C" for problemfri bruk i C++;
- lagring av testkorpus for fuzz-testing: konfigurert permanent lagring av korpus for ClusterFuzzLite CI.
- Dokumentasjon:
- docs/API.md: ny omfattende API- og ABI-håndbok som beskriver alle 21 eksporterte symboler, type-definisjoner, synlighetsstrategi, ABI-versjonering, tråd-sikkerhetsgarantier og feilhåndteringsmaler;
- oppdatert man- og README-filen med installasjonsinstruksjoner og informasjon om pakkenes status (vcpkg, Conan, Homebrew);
- oppdatert fil docs/FORMAT.md med beskrivelse av blokkstørrelseskoding basert på eksponent.
- Oppdatert wrappers for Python, Rust og Node.js.
Kilde: linux.org.ru
