Se ha publicado la versión 1.91 del lenguaje de programación Rust, originalmente desarrollado por Mozilla, pero ahora mantenido por la independiente y sin fines de lucro Rust Foundation. Este lenguaje se enfoca en un 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 de un runtime (el runtime se limita a la inicialización básica y al soporte 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:
- Mejorada la compatibilidad con sistemas ARM de 64 bits que utilizan Windows. La plataforma objetivo «aarch64-pc-windows-msvc» ha pasado del segundo al primer nivel de soporte. Se ha asegurado el segundo nivel de soporte para las arquitecturas aarch64-pc-windows-gnullvm y x86_64-pc-windows-gnullvm. El primer nivel de soporte implica la generación de compilaciones binarias, la realización de pruebas exhaustivas y la garantía más alta de soporte para la plataforma: cada cambio en el compilador se verifica mediante la ejecución de un conjunto completo de pruebas. El segundo nivel de soporte incluye la generación de compilaciones binarias y la garantía de compilación, pero no garantiza la ejecución del conjunto de pruebas. El tercer nivel ofrece soporte básico, pero sin pruebas automatizadas, publicaciones de construcciones oficiales y verificación de la capacidad de compilar código.
- Se ha añadido una advertencia lint «dangling_pointers_from_locals» para identificar el retorno de punteros raw colgantes (dangling raw pointer) que apuntan a datos almacenados en variables locales definidas en la función llamada. Tales variables se eliminan tras la finalización de la función, y los punteros raw a los datos asociados con estas variables se vuelven colgantes, es decir, apuntan a memoria liberada. La posterior de-referencia de dicho puntero conduce a un comportamiento indefinido. fn f() -> *const u8 { let x = 0; &x // advertencia: se producirá un puntero colgante porque la variable local «x» será eliminada }
- Se ha añadido una advertencia lint «integer_to_ptr_transmutes», que informa sobre la conversión de números enteros a punteros utilizando la función std::mem::transmute.
- En el gestor de paquetes Cargo se ha estabilizado el soporte para el parámetro «build.build-dir», que define el directorio para almacenar los artefactos de construcción temporales creados por cargo y rustc durante el proceso de construcción.
- Se ha estabilizado el soporte para la declaración de funciones con un número variable de argumentos en estilo C para ABI sysv64, win64, efiapi y aapcs.
- Se ha estabilizado el soporte para ensamblador en línea para la arquitectura LoongArch32.
- Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo la estabilización de métodos e implementaciones de traits:
- Path::file_prefix
- AtomicPtr::fetch_ptr_add
- AtomicPtr::fetch_ptr_sub
- AtomicPtr::fetch_byte_add
- AtomicPtr::fetch_byte_sub
- AtomicPtr::fetch_or
- AtomicPtr::fetch_and
- AtomicPtr::fetch_xor
- {integer}::strict_add
- {integer}::strict_sub
- {integer}::strict_mul
- {integer}::strict_div
- {integer}::strict_div_euclid
- {integer}::strict_rem
- {integer}::strict_rem_euclid
- {integer}::strict_neg
- {integer}::strict_shl
- {integer}::strict_shr
- {integer}::strict_pow
- i{N}::strict_add_unsigned
- i{N}::strict_sub_unsigned
- i{N}::strict_abs
- u{N}::strict_add_signed
- u{N}::strict_sub_signed
- PanicHookInfo::payload_as_str
- core::iter::chain
- u{N}::checked_signed_diff
- core::array::repeat
- PathBuf::add_extension
- PathBuf::with_added_extension
- Duration::from_mins
- Duration::from_hours
- impl PartialEq<str> for PathBuf
- impl PartialEq<String> for PathBuf
- impl PartialEq<str> for Path
- impl PartialEq<String> for Path
- impl PartialEq<PathBuf> for String
- impl PartialEq<Path> for String
- impl PartialEq<PathBuf> for str
- impl PartialEq<Path> for str
- Ipv4Addr::from_octets
- Ipv6Addr::from_octets
- Ipv6Addr::from_segments
- impl<T> Default for Pin<Box<T>> where Box<T>: Default, T: ?Sized
- impl<T> Default for Pin<Rc<T>> where Rc<T>: Default, T: ?Sized
- impl<T> Default for Pin<Arc<T>> where Arc<T>: Default, T: ?Sized
- Cell::as_array_of_cells
- u{N}::carrying_add
- u{N}::borrowing_sub
- u{N}::carrying_mul
- u{N}::carrying_mul_add
- BTreeMap::extract_if
- BTreeSet::extract_if
- impl Debug for windows::ffi::EncodeWide<‘_>
- str::ceil_char_boundary
- str::floor_char_boundary
- impl Sum for Saturating<u{N}>
- impl Sum<&Self> for Saturating<u{N}>
- impl Product for Saturating<u{N}>
- impl Product<&Self> for Saturating<u{N}>
- El atributo «const» se aplica en las funciones:
- <[T; N]>::each_ref
- <[T; N]>::each_mut
- OsString::new
- PathBuf::new
- TypeId::of
- ptr::with_exposed_provenance
- ptr::with_exposed_provenance_mut
- El compilador se ha actualizado a la rama LLVM 21.
Fuente: opennet.ru
