Foi lançado o versão 0.9.0 da biblioteca e da utilidade de console multiplataforma ZXC (github.com), implementando compressão multithread de alto desempenho assimétrica sem perda e otimizada para recursos de jogos, firmwares e pacotes de aplicativos. O formato foi desenvolvido com o princípio de "escrever uma vez, ler muitas vezes" (WORM).
Ao contrário de codecs como LZ4, o ZXC sacrifica a velocidade de compressão em favor da máxima largura de banda durante a descompressão.
A velocidade de descompressão é declarada em mais de 40% mais alta do que LZ4 no Apple Silicon, mais de 25% mais alta no Google Axion (ARM64) e mais de 5% mais alta no x86_64, mantendo um índice de compressão mais elevado em todos os casos.
Esta versão apresenta uma API de contexto reutilizável, a capacidade de configurar tamanhos de bloco, um guia de referência completo para API e ABI, além de várias correções de segurança, incluindo a eliminação de uma vulnerabilidade de estouro de buffer na pilha, descoberta durante o fuzzing do módulo de compressão.
Esta versão contém mudanças que quebram o ABI, portanto, a SOVERSION foi aumentada para 2.
O projeto é escrito na linguagem C e é distribuído sob a licença BSD 3.
Detalhes
- Mudanças que levam a incompatibilidade:
- SOVERSION 2: A versão ABI da biblioteca foi aumentada. Os arquivos binários compilados para a SOVERSION 1 precisam ser recompilados.
- Estruturas de opções: as funções zxc_compress() e zxc_decompress() agora aceitam zxc_compress_opts_t* e zxc_decompress_opts_t* em vez de parâmetros posicionais. Para um comportamento padrão, passe NULL.
- Codificação do tamanho do bloco: o cabeçalho do arquivo agora armazena o tamanho do bloco como uma exponencial log2 [12..21] em vez da codificação anterior com duas escalas. O valor antigo de 64 ainda é aceito para compatibilidade retroativa.
- Novas funcionalidades:
- Contextos de compressão e descompressão opacos, alocados na pilha, que eliminam a sobrecarga de alocação de memória em cada chamada; ideais para plugins de sistema de arquivos (squashfs, dwarfs) e processamento em lote:
- zxc_create_cctx(), zxc_free_cctx() e zxc_compress_cctx() para compressão;
- zxc_create_dctx(), zxc_free_dctx() e zxc_decompress_dctx() para descompressão;
- os buffers internos só são realocados se o valor block_size ou level mudar entre chamadas.
- Contextos de compressão e descompressão opacos, alocados na pilha, que eliminam a sobrecarga de alocação de memória em cada chamada; ideais para plugins de sistema de arquivos (squashfs, dwarfs) e processamento em lote:
- Tamanhos de bloco configuráveis:
- o tamanho do bloco agora pode ser configurado com o campo block_size na estrutura zxc_compress_opts_t;
- intervalo permitido: de 4 KB a 2 MB (potência de dois);
- por padrão, o valor permanece em 256 KB;
- um novo parâmetro foi adicionado à utilidade de console zxc —block-size (ou -B) com suporte a sufixos de unidade (4K, 1M ou 4KB, 1MB, etc.).
- Descompressão direta rápida:
- quando o buffer de destino está suficientemente preenchido, a descompressão ignora a cópia intermediária para o buffer de trabalho, reduzindo a carga na memória e diminuindo a latência.
- Segurança e estabilidade:
- corrigido o estouro do buffer no zxc_bitpack_stream_32: o ciclo de empacotamento poderia gravar até 4 bytes além do buffer de saída, se o último valor empacotado cruzasse o limite do byte;
- corrigida a verificação do fluxo durante a descompactação (em zxc_decompress.c): foi adicionada uma verificação que garante que o tamanho do fluxo de sequências é suficiente para a quantidade declarada de sequências, o que impede a leitura além do intervalo permitido.
- verificação do tamanho do bloco: agora nas funções zxc_cctx_init() e zxc_read_file_header() é feita uma verificação para que os tamanhos dos blocos estejam dentro do intervalo [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] e sejam potências de dois;
- compatibilidade com C ++: todos os arquivos de cabeçalho públicos agora contêm estruturas de proteção extern "C" para uso sem problemas em C++;
- armazenamento de casos de teste para testes de fuzzing: configurados para armazenamento persistente de casos para ClusterFuzzLite CI.
- Documentação:
- docs/API.md: um novo guia abrangente sobre API e ABI, que descreve todos os 21 símbolos exportados, definições de tipos, estratégia de visibilidade, versionamento de ABI, garantias de segurança de thread e padrões de tratamento de erros;
- atualizados man e o arquivo README com instruções de instalação e informações sobre o status dos pacotes (vcpkg, Conan, Homebrew);
- arquivo atualizado docs/FORMAT.md com a descrição da codificação do tamanho do bloco com base na exponência.
- Atualizados wrappers para Python, Rust e Node.js.
Fonte: linux.org.ru
