Udgivelsen af version 0.9.0 af biblioteket og den tværplatformskonsolapplikation ZXC (github.com), der implementerer højtydende multitrådede asymmetrisk komprimering uden tab og optimeret til spildata, firmware og applikationspakker. Formatet er udviklet efter princippet 'skrive én gang, læse mange gange' (WORM).
I modsætning til kodeker som LZ4, ofrer ZXC komprimeringshastigheden for at opnå maksimal gennemstrømning ved dekomprimering.
Den deklarerede dekomprimeringshastighed er over 40% højere end LZ4 på Apple Silicon, over 25% højere på Google Axion (ARM64) og over 5% højere på x86_64, samtidig med at der i alle tilfælde opnås en højere komprimeringsgrad.
I denne udgave præsenteres et API til genbrugelig kontekst, muligheden for at konfigurere blokstørrelser, en komplet referencemanual for API og ABI, samt flere sikkerhedsrelaterede fejlrettelser, herunder afhjælpning af en buffer overflow-sårbarhed opdaget under fuzzing af kompressionsmodulet.
Denne version indeholder ændringer, der bryder ABI, derfor er SOVERSION steget til 2.
Projektet er skrevet i C og distribueres under BSD 3-licensen.
Detaljer
- Ændringer, der fører til inkompatibilitet:
- SOVERSION 2: Versionen af bibliotekets ABI er blevet øget. Binært filer, der er kompileret til SOVERSION 1, skal recompiles.
- Optionsstrukturer: funktionerne zxc_compress() og zxc_decompress() accepterer nu zxc_compress_opts_t* og zxc_decompress_opts_t* i stedet for positionsbaserede parametre. For standardadfærd, send NULL.
- Block size encoding: Filoverskriften gemmer nu blockstørrelsen som en logaritme til basis 2 [12..21] i stedet for den tidligere to-skala kodning. Den gamle værdi 64 accepteres stadig for bagudkompatibilitet.
- Nye funktioner:
- Uigennemsigtige komprimerings- og dekomprimeringskonkster, der allokeres i hukommelse, eliminerer overhead for hukommelsesallokering ved hver opkald; ideelle til filsystemudvidelser (squashfs, dwarfs) og batchbehandling:
- zxc_create_cctx(), zxc_free_cctx() og zxc_compress_cctx() til komprimering;
- zxc_create_dctx(), zxc_free_dctx() og zxc_decompress_dctx() til dekomprimering;
- interne buffere omfordeles kun, hvis block_size eller level ændres mellem opkaldene.
- Uigennemsigtige komprimerings- og dekomprimeringskonkster, der allokeres i hukommelse, eliminerer overhead for hukommelsesallokering ved hver opkald; ideelle til filsystemudvidelser (squashfs, dwarfs) og batchbehandling:
- Justérbare blokstørrelser:
- Blokstørrelsen kan nu justeres ved hjælp af feltet block_size i strukturen zxc_compress_opts_t;
- Gyldig rækkevidde: fra 4 KB til 2 MB (potens af to);
- Som standard forbliver værdien 256 KB;
- Den konsolbaserede zxc-kommando har fået et nyt parameter —block-size (eller -B) med understøttelse af enhedssuffikser (4K, 1M eller 4KB, 1MB osv.).
- Hurtig direkte dekompression:
- Når destinationsbufferet er tilstrækkeligt fyldt, springes den mellemliggende kopi til arbejdsbufferen over under udpakning, hvilket reducerer hukommelsesbelastningen og forkorter forsinkelsen.
- Sikkerhed og stabilitet:
- Buffer overflow i zxc_bitpack_stream_32 er blevet rettet: pakkecyklussen kunne skrive op til 4 byte uden for outputbufferen, hvis den sidste pakkede værdi krydsede bytegrænsen;
- Strømkontrol ved udpakning er blevet rettet (i zxc_decompress.c): der er tilføjet en kontrol, der sikrer, at strømmen af sekvenser er stor nok til det angivne antal sekvenser, hvilket forhindrer læsning uden for den gyldige rækkefølge.
- Block size kontrol: nu i funktionerne zxc_cctx_init() og zxc_read_file_header() udføres en kontrol, som sikrer, at blockstørrelserne ligger inden for [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] og at de er potenser af to;
- Kompatibilitet med C++: alle offentlige headerfiler indeholder nu beskyttelsesstrukturer extern "C" for problemfri brug i C++;
- Lagring af testkroppe til fuzz-testing: konfigureret en permanent lagring af kroppe til ClusterFuzzLite CI.
- Dokumentation:
- docs/API.md: en ny omfattende API- og ABI-referencer, der beskriver alle 21 eksporterede symboler, type-definitioner, synlighedsstrategi, ABI-versionering, tråd-sikkerheds-garantier og fejlhåndteringsmønstre;
- man og README-filen er blevet opdateret med installationsvejledninger og oplysninger om status på pakker (vcpkg, Conan, Homebrew);
- Filen er blevet opdateret docs/FORMAT.md med en beskrivelse af kodningen af blokstørrelse baseret på eksponentialen.
- Wraps til Python, Rust og Node.js er blevet opdateret.
Kilde: linux.org.ru
