La version 0.9.0 de la bibliothèque et de l'outil en ligne de commande multiplateforme a été publiée. ZXC (github.com), réalisant une compression multi-thread à haute performance asymétrique sans perte, optimisée pour les ressources de jeu, les firmwares et les paquets d'applications. Le format a été conçu selon le principe « écrire une fois, lire plusieurs fois » (WORM). Contrairement à des codecs comme LZ4, ZXC sacrifie la vitesse de compression pour une bande passante maximale lors de la décompression.
Une vitesse de décompression déclarée de 10 à 47 % supérieure à celle de LZ4 avec le niveau de compression par défaut, avec un coefficient de compression égal ou supérieur.
La vitesse de décompression est déclarée supérieure de plus de 40 % par rapport à LZ4 sur Apple Silicon, de plus de 25 % sur Google Axion (ARM64) et de plus de 5 % sur x86_64, tout en offrant un taux de compression plus élevé dans tous les cas.
Cette version présente une API de contexte réutilisable, la possibilité de configurer la taille des blocs, un guide complet de référence sur l'API et l'ABI, ainsi que plusieurs corrections de sécurité, y compris la résolution d'une vulnérabilité de débordement de mémoire dans le module de compression découverte lors du fuzzing.
Cette version contient des modifications incompatibles avec l'ABI, donc le SOVERSION a été augmenté à 2.
compression avec dictionnaire pré-entraîné et table de Huffman commune;
Détails
- Modifications entraînant une incompatibilité:
- SOVERSION 2 : La version ABI de la bibliothèque a été augmentée. Les fichiers binaires compilés sous SOVERSION 1 doivent être recompilés.
- Structures d'options : les fonctions zxc_compress() et zxc_decompress() prennent désormais zxc_compress_opts_t* et zxc_decompress_opts_t* au lieu de paramètres positionnels. Pour un comportement par défaut, passez NULL.
- Encodage de la taille de bloc : L'en-tête de fichier stocke maintenant la taille de bloc sous forme d'exposant log2 [12..21] au lieu de l'ancienne codification à deux échelles. L'ancienne valeur de 64 est toujours acceptée pour la compatibilité descendante.
- Nouvelles fonctionnalités:
- Des contextes d'utilisation et de décompression non transparents, alloués sur le tas, qui éliminent les frais généraux d'allocation de mémoire à chaque appel ; idéaux pour les plugins de système de fichiers (squashfs, dwarfs) et le traitement par lot :
- zxc_create_cctx(), zxc_free_cctx() et zxc_compress_cctx() pour la compression ;
- zxc_create_dctx(), zxc_free_dctx() et zxc_decompress_dctx() pour la décompression ;
- les tampons internes ne sont réalloués que si la valeur block_size ou level change entre les appels.
- Des contextes d'utilisation et de décompression non transparents, alloués sur le tas, qui éliminent les frais généraux d'allocation de mémoire à chaque appel ; idéaux pour les plugins de système de fichiers (squashfs, dwarfs) et le traitement par lot :
- Tailles de blocs configurables:
- la taille de bloc peut maintenant être configurée via le champ block_size dans la structure zxc_compress_opts_t ;
- plage valide : de 4 Ko à 2 Mo (puissance de deux) ;
- la valeur par défaut reste de 256 Ko ;
- un nouveau paramètre a été ajouté à l'outil en ligne de commande zxc —block-size (ou -B) avec support des suffixes d'unités (4K, 1M ou 4KB, 1MB, etc.).
- Décompression directe rapide:
- lorsque le tampon de destination est suffisamment rempli, le copié intermédiaire dans le tampon de travail est omis lors de la décompression, ce qui réduit la charge mémoire et diminue la latence.
- Sécurité et stabilité:
- Correction d'un débordement de tampon dans zxc_bitpack_stream_32 : une boucle de compression pouvait écrire jusqu'à 4 octets en dehors du tampon de sortie si la dernière valeur compressée dépassait la limite de l'octet ;
- Correction de la vérification du flux lors de la décompression (dans zxc_decompress.c) : ajout d'une vérification garantissant que la taille du flux de séquences est suffisante pour le nombre déclaré de séquences, ce qui évite de lire en dehors de la plage autorisée.
- Vérification de la taille du bloc : les fonctions zxc_cctx_init() et zxc_read_file_header() vérifient maintenant que les tailles de bloc sont dans la plage [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] et qu'elles sont des puissances de deux ;
- Compatibilité avec C++ : tous les fichiers d'en-tête publics contiennent désormais des structures de protection externes "C" pour un usage sans problème en C++;
- Stockage des corpus de tests pour les tests de fuzzing : un stockage permanent des corpus a été configuré pour ClusterFuzzLite CI.
- Documentation:
- docs/API.md: nouveau guide complet sur l'API et l'ABI, décrivant tous les 21 symboles exportés, définitions de types, stratégie de visibilité, gestion des versions de l'ABI, garanties de sécurité des flux et modèles de gestion des erreurs ;
- Mise à jour des manuels et du fichier README avec des instructions d'installation et des informations sur l'état des paquets (vcpkg, Conan, Homebrew) ;
- Fichier mis à jour docs/FORMAT.md avec une description de l'encodage de la taille de bloc basé sur l'exposant.
- Mise à jour des wrappers pour Python, Rust et Node.js.
Source : linux.org.ru
