Lanzamiento de Rust 1.86. Preparación de la especificación oficial del lenguaje Rust

Se ha publicado la versión 1.86 del lenguaje de programación de propósito general Rust, originalmente desarrollado por Mozilla, pero ahora mantenido por la organización no lucrativa Rust Foundation. El lenguaje se enfoca en el manejo seguro de la memoria y ofrece herramientas para lograr un alto paralelismo en la ejecución de tareas, sin necesidad de un recolector de basura ni de un entorno de ejecución (runtime que 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:

  • Se ha añadido soporte para el upcasting de rasgos a superrasgos (supertrait), lo que permite convertir directamente una referencia a un objeto de rasgo en una referencia a un objeto de superrasgo sin necesidad de crear un método especial en el rasgo que devuelva una referencia al superrasgo. Esta operación también se puede realizar con otros tipos de punteros inteligentes, por ejemplo, «Arc<dyn Trait> -> Arc<dyn Supertrait>» y «*const dyn Trait -> *const dyn Supertrait». trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
  • Se ha añadido el método get_disjoint_mut() en HashMap y slices para obtener simultáneamente varias referencias mutables a elementos. Anteriormente, el borrow checker no permitía el uso simultáneo de referencias obtenidas mediante el método get_mut(). let v = &mut [1, 2, 3]; if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { *a = 413; *b = 612; } assert_eq!(v, &[413, 2, 612]); if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { a[0] = 8; b[0] = 88; b[1] = 888; } assert_eq!(v, &[8, 88, 888]);
  • Se permite marcar funciones seguras con el atributo «#[target_feature]», indicando que la función utiliza capacidades específicas del CPU. Una función segura marcada con el atributo «#[target_feature]» solo puede ser llamada de manera segura por otra función segura si también está marcada con «#[target_feature]» (de lo contrario, tales funciones deben llamarse dentro de un bloque unsafe). Además, no se pueden pasar a funciones que aceptan parámetros genéricos restringidos por rasgos Fn*. Anteriormente, el atributo «#[target_feature]» solo podía aplicarse a funciones marcadas como «unsafe». #[target_feature(enable = «avx2»)] fn requires_avx2() { // … } #[target_feature(enable = «avx2»)] fn safe_callsite() { requires_avx2(); } fn unsafe_callsite() { if is_x86_feature_detected!(«avx2») { unsafe { requires_avx2() }; } }
  • En el compilador Rust se ha incluido la verificación de depuración (debug-assert) para asegurar que el puntero no contenga un valor NULL al leer y escribir tamaños no nulos, así como al volver a tomar prestado (reborrow) el puntero en una referencia. Por ejemplo, con la activación de las verificaciones de depuración, el siguiente código provocará un estado de ‘panic’: let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
  • Por defecto, se ha habilitado la verificación lint ‘missing_abi’, que genera una advertencia si no se especifica el ABI después de la palabra clave extern. Anteriormente, si no se especificaba un ABI después de extern, se asumía que se utilizaba el ABI ‘C’. Ahora se recomienda especificar explícitamente el ABI ‘C’, por ejemplo, ‘extern “C” {}’ y ‘extern “C” fn’
  • Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo la estabilización de métodos e implementaciones de traits:
    • {float}::next_down
    • {float}::next_up
    • ::get_disjoint_mut
    • ::get_disjoint_unchecked_mut
    • slice::GetDisjointMutError
    • HashMap::get_disjoint_mut
    • HashMap::get_disjoint_unchecked_mut
    • NonZero::count_ones
    • Vec::pop_if
    • sync::Once::wait
    • sync::Once::wait_force
    • sync::OnceLock::wait
  • El atributo «const» se aplica en las funciones:
    • hint::black_box
    • io::Cursor::get_mut
    • io::Cursor::set_position
    • str::is_char_boundary
    • str::split_at
    • str::split_at_checked
    • str::split_at_mut
    • str::split_at_mut_checked
  • Se ha implementado un tercer nivel de soporte para las plataformas {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock, {aarch64-unknown,x86_64-pc}-nto-qnx800, {x86_64,i686}-win7-windows-gnu, amdgcn-amd-amdhsa, x86_64-pc-cygwin, {mips,mipsel}-mti-none-elf, m68k-unknown-none-elf, armv7a-nuttx-{eabi,eabihf}, aarch64-unknown-nuttx y thumbv7a-nuttx-{eabi,eabihf}. El tercer nivel implica soporte básico, pero sin pruebas automatizadas, publicación de compilaciones oficiales y verificación de la capacidad de compilación del código.
  • Se ha añadido una advertencia sobre la finalización del segundo nivel de soporte para la plataforma objetivo i586-pc-windows-msvc en la próxima versión (1.87). Se recomienda utilizar la plataforma i686-pc-windows-msvc, que es compatible con las instrucciones SSE2. La plataforma i586-pc-windows-msvc ha perdido relevancia, ya que Windows 10 requiere soporte para SSE2, y las versiones anteriores de Windows ya no son compatibles en Rust.

Además, se puede destacar que la empresa Ferrocene ha cedido a la comunidad la especificación del lenguaje Rust (FLS - Ferrocene Language Specification), creada durante el desarrollo de su compilador Rust para sistemas críticos y sincronizada periódicamente con el estado actual del compilador Rust principal. La especificación FLS incluye una guía estructurada y detallada sobre la sintaxis, semántica y comportamiento de Rust, adecuada para la verificación, evaluación de compatibilidad y estandarización.

Los materiales proporcionados se utilizarán para crear una especificación estándar para el lenguaje Rust, que podrá ser utilizada en el desarrollo de compiladores alternativos y para la verificación de compiladores en áreas críticas desde el punto de vista de la seguridad.

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