1 puntos por GN⁺ 4 시간 전 | 1 comentarios | Compartir por WhatsApp
  • La versión estable Rust 1.97.0 cambia la forma en que se generan los símbolos de los artefactos de compilación y el flujo de manejo de advertencias de build, y se puede actualizar con rustup update stable
  • symbol mangling v0 pasa a ser el valor predeterminado estable, cambiando a un esquema de nombres de símbolos propio de Rust, mientras que el método anterior basado en Itanium ABI avanza hacia su eliminación
  • Cargo permite controlar las advertencias como allow, warn o deny mediante CARGO_BUILD_WARNINGS en lugar de RUSTFLAGS=-Dwarnings, lo que facilita separar las políticas de CI y builds locales
  • rustc muestra la salida del linker incluso cuando el enlace fue exitoso, como advertencias linker_messages; este lint actualmente no se ve afectado por el grupo de lints warnings
  • La biblioteca estándar incluye la estabilización de Default para RepeatN, Send para std::fs::File en UEFI, métodos de bits para enteros y NonZero, y char::is_control en const context

Actualización a Rust 1.97.0

  • Rust 1.97.0 es una versión estable, y quienes ya hayan instalado Rust con rustup pueden actualizar con el siguiente comando
rustup update stable
  • Si no tienes rustup, puedes obtenerlo en la página de instalación de rustup del sitio web de Rust
  • Los cambios detallados están resumidos en las detailed release notes for 1.97.0
  • Si quieres participar en las pruebas de futuros lanzamientos, puedes usar los canales beta/nightly con rustup default beta o rustup default nightly, y reportar los bugs que encuentres en el Rust issue tracker

Cambios en el comportamiento de compilación y build en stable

  • symbol mangling v0 activado por defecto

    • Cuando Rust se compila a archivos objeto o binarios, cada elemento, como funciones o static, debe tener un símbolo único a nivel global
    • Para evitar colisiones al enlazar distintos programas Rust entre sí, Rust aplica mangling al nombre original de los elementos incorporando contexto como la ruta del módulo, el crate donde se define y genéricos
    • El mangling anterior se basaba en Itanium ABI, que también se usa en algunos casos en C++
    • El nuevo método preserva los valores de instanciación de parámetros genéricos y reduce el problema de que siguiera siendo necesario un demangling personalizado debido a inconsistencias por usar solo parcialmente Itanium ABI
    • Desde Rust 1.59 era posible elegir el esquema de mangling propio de Rust con -Csymbol-mangling-version=v0, y desde noviembre de 2025 se aplica como valor predeterminado en nightly
    • En Rust 1.97, este método pasa a ser el valor predeterminado de Rust estable, y el mangling legacy solo puede activarse en nightly
    • El plan actual es eliminar por completo el mangling legacy
    • Puedes ver más detalles en el artículo anterior switching to v0 mangling on nightly
  • Control de advertencias en Cargo

    • Tratar las advertencias como fallas de build en CI es una práctica común, y antes normalmente se usaba RUSTFLAGS=-Dwarnings
    • Desde Rust 1.97, Cargo controla directamente la relación entre advertencias y éxito del build
      • allow: oculta las advertencias
      • warn: valor predeterminado que las muestra sin hacer fallar el build
      • deny: rechaza las advertencias y las trata como una falla de build
    • Como esta función determina el comportamiento mediante la configuración de Cargo, no invalida la caché de build predeterminada
    • Si después de un refactor quieres reducir temporalmente el ruido de advertencias mientras corriges errores, puedes ejecutarlo así
CARGO_BUILD_WARNINGS=allow cargo check
  • En CI se puede configurar CARGO_BUILD_WARNINGS=deny para rechazar advertencias
  • Si se usa junto con --keep-going, se pueden recopilar todos los errores y advertencias sin detenerse en el primer package que falle
  • La configuración detallada está en la build.warnings documentation de Cargo
  • Visualización predeterminada de la salida del linker

    • rustc invoca el linker en nombre del usuario, y antes ocultaba por defecto la salida del linker si el link era exitoso
    • Desde Rust 1.97, los mensajes del linker se muestran por defecto y se emiten como un warning lint como el siguiente
warning: linker stderr: ignoring deprecated linker optimization setting '1'
  |
  = note: `#[warn(linker_messages)]` on by default
  • rustc filtra mensajes comunes del linker que se diagnostican como falsos positivos o comportamiento intencional
  • Tras dejar de ocultar esta salida en nightly, se corrigieron varios defectos
  • Actualmente linker_messages es un lint especial, y no se ve afectado por el grupo de lints warnings
  • Es común que rustc no pueda controlar con precisión la salida del linker, y la salida podría aparecer solo en algunas plataformas
  • Si parece una salida falsa positiva del linker, puedes enviar un issue
  • Para ocultar la advertencia, puedes configurar el nivel del lint como allow, y agregar la siguiente sección lints a Cargo.toml
[lints.rust]
linker_messages = "allow"

API estabilizadas

Changelogs relacionados

1 comentarios

 
GN⁺ 4 시간 전
Opiniones en Lobste.rs
  • Que en Rust 1.97 Cargo ahora pueda controlar la relación entre las advertencias y si la compilación fue exitosa es una nueva función muy buena.
    Si después de una refactorización las advertencias estorban mientras corriges errores, puedes ocultarlas temporalmente con CARGO_BUILD_WARNINGS=allow cargo check, y en CI puedes hacer que las advertencias cuenten como fallas con CARGO_BUILD_WARNINGS=deny. Si lo usas junto con --keep-going, puedes reunir todos los errores y advertencias sin detenerte en el primer paquete que falle.

  • Quizá convenga posponer la actualización por un momento. Parece que hay un bug de compilación incorrecta.
    https://github.com/rust-lang/rust/issues/159035

    • Curiosamente, esta compilación incorrecta ya existía desde hace 10 releases, pero antes leía apenas un poco fuera de rango y ahora parece leer mucho más fuera de rango, lo que provoca un segfault.
    • Era un bug de LLVM. Por suerte, la corrección parece bastante directa.
      https://github.com/llvm/llvm-project/pull/208683
  • Genial. Me pregunto si alguien podría resumir el avance en la implementación de los tipos de patrón.

  • Lamentablemente, el never type tampoco se estabilizó esta vez. Espero el próximo release.

    • El chiste de que “el never type recibió su nombre por su fecha de estabilización” ya casi está llegando a su fin.
    • Un integrante del equipo del compilador dio una charla sobre el never type en RustWeek. Recomiendo verla, ya que puede ayudar a estimar mejor sus perspectivas de estabilización: https://www.youtube.com/watch?v=3jM4cnEVrLc