Se ha publicado el lanzamiento del lenguaje de programación Rust 1.99, inicialmente desarrollado por Mozilla, pero que ahora es mantenido por la organización independiente sin fines de lucro Rust Foundation. El lenguaje se centra en el manejo seguro de la memoria y proporciona herramientas para lograr un alto paralelismo en la ejecución de tareas, sin necesidad de un recolector de basura ni 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 están diseñados para eliminar errores al manipular punteros y protegerse de problemas que surgen del trabajo de bajo nivel con la memoria, como acceder a la memoria después de que se ha liberado, desreferenciar punteros nulos, desbordar búferes, etc. Para la distribución de bibliotecas, la construcción y la gestión de dependencias, se desarrolla el gestor de paquetes Cargo. Para el alojamiento de 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:
- Se ha añadido la capacidad de crear funciones en el lenguaje Rust con un número variable de argumentos (variadic), exportables para ser llamadas desde proyectos en C (C ABI). Como último elemento de la lista de parámetros en tales funciones, se puede indicar la construcción «…», que se procesa en Rust mediante un tipo especial VaList, que funciona de manera similar a va_list en C. unsafe extern «C» fn sum(mut args: …) -> i32 { let a = unsafe { args.next_arg::() }; let b = unsafe { args.next_arg::() }; a + b } fn foo() -> i32 { unsafe { sum(0i32, 2i32) } }
- Se han estabilizado las funciones Layout::for_value_raw, mem::size_of_val_raw y mem::align_of_val_raw, que permiten determinar de manera segura el tamaño y la alineación a través de punteros crudos (raw pointer), incluso al usar tipos de tamaño dinámico, como los slices, sin necesidad de crear referencias a los datos.
- Se ha añadido una recomendación en la documentación para evitar la liberación de memoria a la que se ha obtenido una referencia estática con tiempo de vida ilimitado (&’static) mediante la llamada a Box::leak (round-trip unleaking), ya que dicha acción puede potencialmente causar problemas debido a la incompatibilidad con futuras optimizaciones del compilador y mecanismos de gestión de memoria. En lugar de crear una referencia estática para la transferencia temporal de propiedad, se recomienda utilizar punteros crudos, por ejemplo, mediante la llamada a Box::into_non_null.
- Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo la estabilización de métodos e implementaciones de traits:
- IntoIterator for Box
- IntoIterator for &Box
- IntoIterator for &mut Box
- VecDeque::retain_back
- core::ffi::VaList
- Box::into_non_null
- Box::from_non_null
- Vec::into_parts
- Vec::from_parts
- core::mem::size_of_val_raw
- core::mem::align_of_val_raw
- core::alloc::Layout::for_value_raw
- String::from_utf8_lossy_owned
- string::FromUtf8Error::into_utf8_lossy
- FusedIterator for StepBy
- std::fs::set_times
- std::fs::set_times_nofollow
- En el administrador de paquetes cargo se ha implementado un nuevo perfil incorporado ‘debug’, similar al perfil ‘dev’ (futuras posibilidades para depuración y desarrollo se planea separar). Al compilar en CI, la compilación incremental está desactivada por defecto.
- La plataforma objetivo riscv64-unknown-linux-musl ha sido trasladada al segundo nivel de soporte, lo que implica garantía de compilación, pero sin garantías al pasar el conjunto de pruebas.
También se pueden señalar proyectos y eventos recientemente anunciados relacionados con Rust:
- Microsoft ha elevado a Rust a un lenguaje de primer nivel y proporcionará apoyo completo en todas las etapas de desarrollo dentro de la empresa. Antes de esto, el primer nivel de soporte dentro de la compañía se ofrecía para los lenguajes C++, C# y TypeScript. Se informa que Rust ya se utiliza en más de 100 repositorios de Microsoft. Entre otras cosas, se aplican componentes en Rust en productos como Microsoft 365 y Copilot, y se ha preparado un backend separado rustc_codegen_utc para el compilador MSVC basado en el compilador rustc.
Como objetivo principal de la aplicación de Rust en Microsoft se menciona el refuerzo de la seguridad del código crítico desde el punto de vista de la seguridad. Según el director técnico de Microsoft Azure, alrededor del 70% de todas las vulnerabilidades en Windows son causadas por problemas de manejo de memoria, los cuales se pueden evitar mediante el uso de Rust.
- Google ha eliminado del núcleo de Linux la antigua implementación del mecanismo de comunicación entre procesos Binder, escrita en C, a favor del nuevo controlador Binder IPC, reescrito en Rust. Se señala que durante los 15 años de existencia del antiguo controlador se acumuló una deuda técnica significativa y una multitud de complicaciones que dificultaban la búsqueda de errores, el mantenimiento y la adición de nuevas capacidades. El controlador Binder IPC en Rust se considera principal y ya no se presenta como un desarrollo experimental.
- Se ha publicado la versión Arti 2.7.0, una implementación de la herramienta Tor, escrita en 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 otorgar a Arti el estatus de implementación principal de Tor y dejar de mantener la implementación en C. En la nueva versión se han realizado avances en la funcionalidad para relay. servidores directorio (Directory Authority), relacionado con el análisis de documentos, el soporte de la replicación de servidores de directorios y el procesamiento del tráfico DNS. Se ha agregado una implementación de RPC para modificar y verificar la configuración. Se han solucionado varias vulnerabilidades; se recomienda a los administradores de servicios onion actualizar sus sistemas de inmediato.
Fuente: opennet.ru
