Izlaista 0.9.0 bibliotēkas un multiplatformas konsoles rīka versija ZXC (github.com), nodrošinot augstas veiktspējas daudzuzdevumu asimetrisko saspiest bez zaudējumiem un optimizēts spēļu resursiem, programmatūrai un lietojumprogrammu pakotnēm. Formāts izstrādāts pēc principa «vienu reizi ierakstīt, vairākkārt lasīt» (WORM).
Atšķirībā no tādām kodekām kā LZ4, ZXC upurē saspiešanas ātrumu maksimālai caurlaidspējai atšifrēšanā.
Deklarēts, ka izsaiņošanas ātrums ir par 40%+ augstāks nekā LZ4 Apple Silicon, par 25%+ augstāks Google Axion (ARM64) un par 5%+ augstāks x86_64, nodrošinot augstāku saspiešanas koeficientu visos gadījumos.
Šajā laidienā ir ieviests vairākkārt izmantoto kontekstu API, iespēja pielāgot bloku izmērus, pilns API un ABI rokasgrāmata, kā arī vairāki drošības labojumi, tostarp bufera pārplūdes ievainojamības novēršana, kas tika atklāta, fāzējot saspiešanas moduļa moduli.
Šis laidums satur izmaiņas, kas pārkāpj ABI, tāpēc SOVERSION ir palielināta līdz 2.
Projekts ir uzrakstīts C valodā un tiek izplatīts saskaņā ar BSD 3 licenci.
Sīkāka informācija
- Izmaiņas, kas noved pie nesaderības:
- SOVERSION 2: Bibliotēkas ABI versija ir palielināta. Binārās faili, kas tika kompilēti zem SOVERSION 1, ir jākompilē atkārtoti.
- Opciju struktūras: funkcijas zxc_compress() un zxc_decompress() tagad pieņem zxc_compress_opts_t* un zxc_decompress_opts_t* vietā pozicionālās parametru. Lai iegūtu noklusējuma uzvedību, nododiet NULL.
- Bloku izmēru kodēšana: faila galvenes tagad saglabā bloku izmēru kā eksponenti log2 [12..21] vietā iepriekšējās divu mērogu kodēšanas. Vecais 64 joprojām tiek pieņemts atpakaļsaderībai.
- Jaunas iespējas:
- Neprosmīgi saspiešanas un izsaiņošanas konteksti, kas tiek piešķirti kaudzē, novērš atmiņas piešķiršanas izmaksas katra izsaukuma gadījumā; ideāli piemēroti failu sistēmas spraudņiem (squashfs, dwarfs) un partijas apstrādei:
- zxc_create_cctx(), zxc_free_cctx() un zxc_compress_cctx() saspiešanai;
- zxc_create_dctx(), zxc_free_dctx() un zxc_decompress_dctx() izsaiņošanai;
- Iekšējie buferi tiek pārdalīti tikai tad, ja starp izsaukumiem mainās block_size vai level vērtība.
- Neprosmīgi saspiešanas un izsaiņošanas konteksti, kas tiek piešķirti kaudzē, novērš atmiņas piešķiršanas izmaksas katra izsaukuma gadījumā; ideāli piemēroti failu sistēmas spraudņiem (squashfs, dwarfs) un partijas apstrādei:
- Pielāgojami bloku izmēri:
- bloku izmēru tagad var pielāgot, izmantojot block_size lauku zxc_compress_opts_t strukturā;
- atļautais diapazons: no 4 KB līdz 2 MB (divkāršā pakāpe);
- noklusējuma vērtība paliek 256 KB;
- Konsoles rīkam zxc pievienots jauns parametrs —block-size (vai -B) ar mērvienību sufiksu atbalstu (4K, 1M vai 4KB, 1MB utt.).
- Ātra tieša izsaiņošana:
- kad mērķa buferis ir pietiekami piepildīts, izsaiņojot tiek izlaista starpmaku komutācija darba buferī, tādējādi samazinot atmiņas slodzi un aizkavi.
- Drošība un stabilitāte:
- izlabota buferi pārsniegšana heap zxc_bitpack_stream_32: iepakošanas cikls varēja ierakstīt līdz 4 baitiem ārpus izejas bufera, ja pēdējais iepakotais vērtība pārsniedza bita robežu;
- izlabota plūsmas pārbaude atpakošanai (zxc_decompress.c): pievienota pārbaude, kas nodrošina, ka secību plūsmas izmērs ir pietiekams norādītajam secību skaitam, novēršot lasīšanu ārpus atļautā diapazona.
- bloka izmēra pārbaude: tagad funkcijās zxc_cctx_init() un zxc_read_file_header() tiek veikta pārbaude, ka bloku izmēri ir diapazonā [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] un tie ir divu pakāpes;
- savietojamība ar C++: visi publiskie galvenes faili tagad satur aizsargājošās konstrukcijas extern "C" bez problēmām lietošanai C++;
- testu korpusa glabāšana fuzinga testēšanai: konfigurēta pastāvīga korpusa glabāšana ClusterFuzzLite CI.
- Dokumentācija:
- docs/API.md: jauns visaptverošs API un ABI rokasgrāmata, kurā aprakstīti visi 21 eksportētais simbols, tipu definīcijas, redzamības stratēģija, ABI versiju kontrole, pavedienu drošības garantijas un kļūdu apstrādes veidnes;
- atjaunināta man un README fails ar instalēšanas instrukcijām un informāciju par pakotņu statusu (vcpkg, Conan, Homebrew);
- atjaunināts fails docs/FORMAT.md ar bloka izmēra kodēšanas aprakstu, pamatojoties uz eksponentu.
- Atjaunināti Python, Rust un Node.js wrapperi.
Avots: linux.org.ru
