Arquitectura
Los crates que forman Arca y la política de unsafe que los mantiene unidos.
Actualizado el
Arca es un workspace de Cargo. Cada crate tiene una sola tarea y una postura declarada sobre el código unsafe.
Crates
El workspace también contiene arca-drag y arca-net; consulta sus fuentes para más detalles.
CLI y escritorio comparten arca_core::Format. WRITABLE (formatos cuyos
archivos existentes se pueden reescribir) incluye 7z, pero no RAR; CREATABLE
añade RAR, que se puede crear desde cero pero nunca modificar, y nunca CBR ni
ISO. RAR está activo por defecto en CLI y GUI; rars habilita
encryption y write, nunca recovery ni parallel. arca_rar::create_rar
recibe fuentes explícitas (los clientes recorren los directorios con sus propios
límites), prepara el archivo junto al destino, lo verifica con el lector y lo
publica sin reemplazar nunca un fichero. El escritorio
comparte la validación de contraseñas en segundo plano entre ZIP, 7z y RAR, con
reintentos, cancelación y reanudación de la acción original. El CRC es opcional:
una suma ausente no se muestra como un cero inventado.
La política de unsafe
Los crates de análisis de Arca declaran #![forbid(unsafe_code)]; esto no abarca
todas las dependencias transitivas. Bzip2/Zstandard nativos son códecs opcionales;
las bibliotecas gráficas y del SO tienen sus propios límites de unsafe. El parser
7z vendorizado y su decodificador LZMA fijado compilan con unsafe prohibido.
#![forbid(unsafe_code)]// A malformed archive produces an error, never memory corruption.match ZipArchive::open(file) { Ok(archive) => list(archive), Err(e) => eprintln!("arca: {e}"),}Dependencias clave
Límites de 7z
- Cabeceras codificadas/descodificadas: 16 MiB cada una; entradas, bloques y flujos: 100.000.
- Hasta cuatro codificadores de una entrada/salida por bloque; BCJ2 multientrada no se admite.
- Diccionarios LZMA: 256 MiB por etapa; ventana Zstd: 256 MiB. No es una cuota global de memoria. No hay límite total de bytes extraídos ni de tiempo de CPU.
- Lectura básica: Copy, LZMA, LZMA2, DEFLATE, AES, BCJ/Delta de un flujo.
codecs-nativeañade Bzip2 y Zstd. PPMd, Brotli y LZ4 no se admiten. - La extracción cifrada valida todo el origen estable antes de escribir y luego procesa los bloques seleccionados. CRC-32 no es autenticación.
- La cancelación es cooperativa; el análisis de cabeceras y la KDF están acotados pero no se pueden interrumpir internamente. La vista previa limita el tamaño.
Entry.offsetes un índice en 7z, no un desplazamiento.Method::code()devuelve ahoraResult<u16>y rechaza métodos que no sean ZIP.
CLI/GUI propagan codecs-native explícitamente, sin activar los valores por
defecto de las dependencias de archivos. cargo build --release --no-default-features
omite compresión nativa, no bibliotecas del SO/gráficas. Para auditarlo:
cargo tree -p arca-cli --no-default-features -e normalcargo tree -p arca-gui --no-default-features -e normalcargo tree -p arca-7z -e features -i lzma-rust2Los dos primeros no deben contener los nativos zstd-sys ni bzip2-sys.
La GUI incluye libbz2-rs-sys por la descompresión HTTP de GPUI: pese al nombre,
es una implementación Rust sin compilación C, no el decodificador Bzip2 de 7z.
LZMA debe activar std/encoder, nunca optimization. El workspace mantiene
Rust 1.95 y edición 2021; cada dependencia elige su edición. Consulta el
diseño aceptado
y el inventario de parches.
Perfiles de compilación
[profile.dev.package."*"]opt-level = 3[profile.dev]opt-level = 1[profile.release]opt-level = 3lto = "fat"codegen-units = 1panic = "abort"strip = trueLas dependencias se optimizan incluso en builds de depuración: el motor de maquetación de GPUI, el shaper de texto y el rasterizador rehacen su trabajo en cada fotograma, y con opt-level = 0 eso se nota como tirones al arrastrar. El código propio de Arca compila en el nivel 1, lo que mantiene el depurador útil.