È stata rilasciata la versione 0.9.0 della libreria e dell'utilità da console multipiattaforma. ZXC (github.com), che implementa un'alta prestazione multithreaded compressione asimmetrica senza perdite e ottimizzata per risorse di gioco, firmware e pacchetti di applicazioni. Il formato è stato sviluppato secondo il principio "scrivi una volta, leggi molte volte" (WORM).
A differenza di codec come LZ4, ZXC sacrifica la velocità di compressione per massimizzare la larghezza di banda durante la decompressione.
Si dichiara che la velocità di decompressione è superiore del 40%+ rispetto a LZ4 su Apple Silicon, del 25%+ su Google Axion (ARM64) e del 5%+ su x86_64, con un coefficiente di compressione più elevato in tutti i casi.
Questa versione presenta un'API per contesti riutilizzabili, la possibilità di configurare le dimensioni dei blocchi, una guida completa all'API e all'ABI, oltre a diverse correzioni relative alla sicurezza, inclusa la rimozione di una vulnerabilità di overflow del buffer nella heap identificata durante il fuzzing del modulo di compressione.
Questa release contiene modifiche che rompono l'ABI, quindi SOVERSION è aumentata a 2.
Il progetto è scritto in linguaggio C ed è distribuito sotto licenza BSD 3.
Dettagli
- Modifiche che portano a incompatibilità.:
- SOVERSION 2: La versione ABI della libreria è stata aumentata. I file binari compilati con SOVERSION 1 devono essere ricompilati.
- Strutture delle opzioni: le funzioni zxc_compress() e zxc_decompress() ora accettano zxc_compress_opts_t* e zxc_decompress_opts_t* invece di parametri posizionali. Per il comportamento predefinito, passare NULL.
- Codifica della dimensione del blocco: L'intestazione del file ora memorizza la dimensione del blocco come esponente log2 [12..21] invece della precedente codifica a due scale. Il valore precedente di 64 è ancora accettato per compatibilità inversa.
- Nuove funzionalità:
- Contesti di compressione e decompressione opachi, allocati nella heap, che eliminano il sovraccarico di allocazione della memoria a ogni chiamata; ideali per i plugin di file system (squashfs, dwarfs) e l'elaborazione batch:
- zxc_create_cctx(), zxc_free_cctx() e zxc_compress_cctx() per la compressione;
- zxc_create_dctx(), zxc_free_dctx() e zxc_decompress_dctx() per la decompressione;
- i buffer interni vengono riallocati solo se il valore di block_size o level cambia tra le chiamate.
- Contesti di compressione e decompressione opachi, allocati nella heap, che eliminano il sovraccarico di allocazione della memoria a ogni chiamata; ideali per i plugin di file system (squashfs, dwarfs) e l'elaborazione batch:
- Dimensioni dei blocchi personalizzabili.:
- la dimensione del blocco può ora essere configurata utilizzando il campo block_size nella struttura zxc_compress_opts_t;
- intervallo valido: da 4 KB a 2 MB (potenza di due);
- di default il valore rimane 256 KB;
- alla utility da console zxc è stato aggiunto un nuovo parametro —block-size (o -B) con supporto per suffissi di unità (4K, 1M o 4KB, 1MB, ecc.).
- Decompressione diretta rapida.:
- quando il buffer di destinazione è sufficientemente pieno, durante la decompressione viene saltata la copia intermedia nel buffer di lavoro, riducendo l'uso della memoria e diminuendo la latenza.
- Sicurezza e stabilità.:
- correzione di un overflow del buffer heap in zxc_bitpack_stream_32: il ciclo di impacchettamento poteva scrivere fino a 4 byte oltre il buffer di uscita se l'ultimo valore imballato superava il confine del byte;
- correzione del controllo del flusso durante la decompressione (in zxc_decompress.c): è stato aggiunto un controllo per garantire che la dimensione del flusso delle sequenze sia sufficiente per il numero dichiarato di sequenze, prevenendo la lettura oltre l'intervallo consentito.
- verifica della dimensione del blocco: ora nelle funzioni zxc_cctx_init() e zxc_read_file_header() viene eseguita una verifica che assicura che le dimensioni dei blocchi siano nell'intervallo [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] e siano potenze di due;
- compatibilità con C++: tutti i file di intestazione pubblici contengono ora costrutti di protezione extern "C" per un utilizzo senza problemi in C++;
- archiviazione del corpus di test per il testing di fuzzing: è stato configurato un archivio permanente per il corpus per ClusterFuzzLite CI.
- Documentazione:
- docs/API.md: nuova guida completa per API e ABI, che descrive tutti i 21 simboli esportati, definizioni dei tipi, strategia di visibilità, versioning ABI, garanzie di thread safety e modelli di gestione degli errori;
- aggiornati il man e il file README con istruzioni per l'installazione e informazioni sullo stato dei pacchetti (vcpkg, Conan, Homebrew);
- file aggiornato docs/FORMAT.md con la descrizione della codifica della dimensione del blocco basata sull'esponenziale.
- Aggiornati i wrapper per Python, Rust e Node.js.
Fonte: linux.org.ru
