Lanzamiento de Rust 1.93. Proyectos Rex, Fjall 3 y Arti 1.9.0

Se ha publicado la versión 1.93 del lenguaje de programación Rust, desarrollado inicialmente por Mozilla y actualmente bajo el auspicio de la organización sin fines de lucro Rust Foundation. Este lenguaje se centra en la seguridad al manejar la memoria y proporciona herramientas para lograr un alto paralelismo en la ejecución de tareas, todo ello sin necesidad de un recolector de basura ni de un runtime (el runtime se limita a la inicialización básica y al mantenimiento de la biblioteca estándar).

Los métodos de manejo de memoria en Rust eliminan los errores del desarrollador al manipular punteros y protegen contra problemas que surgen del trabajo de bajo nivel con la memoria, como el acceso a áreas de memoria después de su liberación, desreferenciación de punteros nulos, desbordamientos de búfer, etc. Para la distribución de bibliotecas, la gestión de dependencias y la construcción de proyectos, se está desarrollando el administrador de paquetes Cargo. Para alojar bibliotecas, se soporta el repositorio crates.io.

La seguridad en el manejo de la memoria se garantiza en Rust en tiempo de compilación a través de la verificación de referencias, el seguimiento de la propiedad de los objetos, la gestión de tiempos de vida de objetos (ámbitos) y la evaluación de la corrección del acceso a la memoria durante la ejecución del código. Rust también ofrece herramientas para protegerse contra desbordamientos enteros, requiere la inicialización obligatoria de los valores de las variables antes de su uso, maneja mejor los errores en la biblioteca estándar, aplica el concepto de inmutabilidad de referencias y variables por defecto, y ofrece una fuerte tipificación estática para minimizar errores lógicos.

Novedades principales:

  • La biblioteca estándar de C Musl, incluida en la entrega de Rust y utilizada para la vinculación estática en plataformas objetivo «*-linux-musl» (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl, etc.) en sistemas sin Musl, se ha actualizado a la versión 1.2.5. La versión mínima de Musl soportada para vinculación dinámica también ha sido elevada a la versión 1.2.5. Anteriormente, Rust utilizaba la versión 1.2.3 de Musl, que tenía problemas en la implementación del resolutor DNS. En la versión 1.2.4 de Musl, se añadió la capacidad de enviar consultas por TCP en caso de fallos en las consultas por UDP, resolviendo así problemas con la consulta de grandes registros DNS y mejorando la compatibilidad con servidores DNS recursivos que no soportan la devolución de parte de los resultados en respuestas UDP truncadas. En la versión 1.2.5 de Musl, se implementó el manejo de respuestas con largas cadenas CNAME en el resolutor DNS y se solucionó un problema que provocaba la pérdida de algunas respuestas grandes transmitidas por TCP.
  • La biblioteca estándar ha sido rediseñada para abordar problemas de reentrabilidad al utilizar allocadores de memoria globales escritos en Rust, el macro std::thread_local! y la función std::thread::current, que causaban recursión infinita. Para evitar la situación en la cual std::thread_local! y std::thread::current invocaban el mismo allocador durante la asignación de memoria, ahora se aplica directamente el mecanismo del sistema para la asignación de memoria.
  • Dentro de los bloques «asm!» con código ensamblador, se permite el uso de atributos «cfg», lo que, por ejemplo, permite gestionar la activación de conjuntos de instrucciones ampliados del CPU en el contexto de expresiones individuales dentro del bloque asm (anteriormente, los atributos «cfg» solo podían establecerse para el bloque asm completo). asm!( // o global_asm! o naked_asm! "nop", #[cfg(target_feature = "sse2")] "nop", // … #[cfg(target_feature = "sse2")] a = const 123, // solo usado en sse2 );
  • Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo la estabilización de métodos e implementaciones de traits:
    • <[MaybeUninit]>::assume_init_drop
    • <[MaybeUninit]>::assume_init_ref
    • <[MaybeUninit]>::assume_init_mut
    • <[MaybeUninit]>::write_copy_of_slice
    • <[MaybeUninit]>::write_clone_of_slice
    • String::into_raw_parts
    • Vec::into_raw_parts
    • ::unchecked_neg
    • ::unchecked_shl
    • ::unchecked_shr
    • ::unchecked_shl
    • ::unchecked_shr
    • ::as_array
    • ::as_array_mut
    • ::as_array
    • ::as_mut_array
    • VecDeque::pop_front_if
    • VecDeque::pop_back_if
    • Duration::from_nanos_u128
    • char::MAX_LEN_UTF8
    • char::MAX_LEN_UTF16
    • std::fmt::from_fn
    • std::fmt::FromFn
  • La plataforma objetivo «riscv64a23-unknown-linux-gnu» ha sido trasladada a un segundo nivel de soporte, que implica garantía de construcción, pero sin garantías al pasar el conjunto de pruebas.

Además, se pueden mencionar varios proyectos relacionados con Rust:

  • Para el núcleo de Linux, se está desarrollando el marco Rex, que permite crear complementos para el núcleo de Linux en el lenguaje Rust, utilizables para extender la funcionalidad del núcleo en lugar de eBPF. Rex proporciona las mismas garantías de seguridad que eBPF, pero utiliza las capacidades del lenguaje Rust y un Runtime ligero para la aislamiento y la seguridad. Para estos programas, no se aplica un verificador, y las aplicaciones se compilan en código nativo con el compilador Rust.

    En los programas de Rex se permite el uso de un subconjunto del lenguaje Rust que ofrece garantías de seguridad. En su estado actual, se admiten 5 tipos de programas eBPF: kprobe, perf_event, tracepoint, xdp y tc. Existe la posibilidad de llamar a funciones auxiliares de eBPF, interactuar con estructuras map de eBPF, gestionar recursos del núcleo, manejar excepciones y utilizar envolturas y abstracciones sobre estructuras del núcleo.

  • Se encuentra disponible la versión Fjall 3, un almacenamiento embebido escrito en Rust, que trabaja con datos en formato clave-valor. El almacenamiento de datos se realiza en forma de log utilizando un árbol LSM (Log-Structured-Merge), similar a RocksDB, donde los cambios se registran añadiendo datos al final del archivo. Se ofrece una API inspirada en BTreeMap para acceder a la base de datos. Se soportan características como espacios de nombres, búsqueda directa e inversa por rangos, compresión incorporada, transacciones serializables, almacenamiento separado de claves y valores muy grandes asociados, y mantenimiento automático en segundo plano de la base de datos. El código está abierto bajo la licencia Apache 2.0.
  • El proyecto Tor ha publicado la versión Arti 1.9.0, una implementación de las herramientas de Tor, escrita en el lenguaje Rust. Cuando el código de Arti alcance un nivel que pueda reemplazar completamente la versión en C, los desarrolladores de Tor tienen la intención de convertir a Arti en la implementación principal de Tor y gradualmente dejar de dar soporte a la implementación en C. En esta nueva versión se ha continuado con la implementación de funcionalidades para los relés y servidores directorios (Directory Authority), se ha mejorado el soporte para trabajar con puertos asignados dinámicamente (proxy.socks_listen = "auto"), y se ha añadido una API experimental para la gestión de claves para los servicios onion.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster