1 Punkte von GN⁺ 4 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • Das Stable-Release Rust 1.97.0 ändert, wie Symbole in Compiler-Artefakten erzeugt werden und wie Build-Warnungen verarbeitet werden; ein Update ist mit rustup update stable möglich
  • symbol mangling v0 ist nun der Stable-Standard und stellt auf ein Rust-spezifisches Schema für Symbolnamen um; das bisherige Verfahren auf Basis der Itanium ABI bewegt sich in Richtung Entfernung
  • Cargo steuert Warnungen statt über RUSTFLAGS=-Dwarnings nun über CARGO_BUILD_WARNINGS mit allow, warn und deny, wodurch sich CI- und lokale Build-Richtlinien leichter trennen lassen
  • rustc zeigt Linker-Ausgaben auch bei erfolgreichem Linken als linker_messages-Warnungen an; dieser Lint wird derzeit nicht von der Lint-Gruppe warnings beeinflusst
  • Die Standardbibliothek enthält unter anderem Default für RepeatN, Send für std::fs::File auf UEFI, Bit-Methoden für Integer und NonZero sowie die Stabilisierung von char::is_control in const-Kontexten

Rust 1.97.0 Update

  • Rust 1.97.0 ist ein Stable-Release; wer Rust bereits mit rustup installiert hat, kann mit folgendem Befehl aktualisieren
rustup update stable
  • Falls rustup nicht vorhanden ist, kann es über die rustup-Installationsseite der Rust-Website bezogen werden
  • Die detaillierten Änderungen sind in den detailed release notes for 1.97.0 zusammengefasst
  • Wer an Tests künftiger Releases teilnehmen möchte, kann mit rustup default beta oder rustup default nightly den beta/nightly-Kanal verwenden; gefundene Bugs können im Rust issue tracker gemeldet werden

Geändertes Compile- und Build-Verhalten in Stable

  • symbol mangling v0 standardmäßig aktiviert

    • Wenn Rust zu Objektdateien oder Binaries kompiliert wird, muss jedes Element wie Funktionen oder statics ein global eindeutiges symbol besitzen
    • Um Kollisionen beim gemeinsamen Linken verschiedener Rust-Programme zu vermeiden, mangelt Rust den ursprünglichen Elementnamen und fügt Kontext wie Modulpfad, definierende Crate und Generics hinzu
    • Das bisherige Mangling basierte auf der Itanium ABI, die teilweise auch in C++ verwendet wird
    • Das neue Verfahren bewahrt die Instanziierungswerte generischer Parameter und reduziert Probleme, bei denen wegen Inkonsistenzen durch die nur teilweise genutzte Itanium ABI weiterhin Custom-Demangling nötig war
    • Seit Rust 1.59 konnte das Rust-spezifische Mangling mit -Csymbol-mangling-version=v0 gewählt werden; seit November 2025 gilt es auf nightly standardmäßig
    • In Rust 1.97 wird dieses Verfahren zum Standard in Stable Rust; das Legacy-Mangling lässt sich nur noch auf nightly aktivieren
    • Der aktuelle Plan ist, das Legacy-Mangling vollständig zu entfernen
    • Weitere Details stehen im früheren Beitrag switching to v0 mangling on nightly
  • Warnungssteuerung in Cargo

    • Warnungen in der CI als Build-Fehler zu behandeln, ist gängige Praxis; bisher wurde dafür üblicherweise RUSTFLAGS=-Dwarnings verwendet
    • Ab Rust 1.97 steuert Cargo die Beziehung zwischen Warnungen und Build-Erfolg direkt
      • allow: Warnungen ausblenden
      • warn: Standardwert, der Warnungen anzeigt, ohne den Build fehlschlagen zu lassen
      • deny: Warnungen ablehnen und als Build-Fehler behandeln
    • Da das Verhalten über die Cargo-Konfiguration bestimmt wird, invalidiert diese Funktion den Standard-Build-Cache nicht
    • Wenn man nach einem Refactoring während der Fehlerbehebung das Warnungsrauschen vorübergehend reduzieren möchte, kann man zum Beispiel Folgendes ausführen
CARGO_BUILD_WARNINGS=allow cargo check
  • In der CI kann CARGO_BUILD_WARNINGS=deny gesetzt werden, um Warnungen abzulehnen
  • Zusammen mit --keep-going lassen sich alle Fehler und Warnungen sammeln, ohne beim ersten fehlgeschlagenen Package anzuhalten
  • Details zur Konfiguration finden sich in Cargos build.warnings documentation
  • Linker-Ausgaben standardmäßig anzeigen

    • rustc ruft im Auftrag der Nutzer den linker auf; bisher wurden Linker-Ausgaben standardmäßig verborgen, wenn das Linken erfolgreich war
    • Ab Rust 1.97 werden linker messages standardmäßig angezeigt und als folgender warning lint ausgegeben
warning: linker stderr: ignoring deprecated linker optimization setting '1'
  |
  = note: `#[warn(linker_messages)]` on by default
  • rustc filtert häufige linker messages heraus, die als False Positives oder beabsichtigtes Verhalten diagnostiziert wurden
  • Nachdem diese Ausgaben auf nightly nicht mehr verborgen wurden, wurden mehrere Fehler behoben
  • Derzeit ist linker_messages ein spezieller Lint und wird nicht von der Lint-Gruppe warnings beeinflusst
  • Üblicherweise kann rustc Linker-Ausgaben nicht präzise steuern, und die Ausgabe kann nur auf bestimmten Plattformen erscheinen
  • Wenn es wie eine False-Positive-Ausgabe des Linkers aussieht, kann ein issue eingereicht werden
  • Um die Warnung auszublenden, kann der Lint-Level auf allow gesetzt werden; dazu lässt sich folgender lints-Abschnitt in Cargo.toml hinzufügen
[lints.rust]
linker_messages = "allow"

Stabilisierte APIs

Zugehörige Changelogs

1 Kommentare

 
GN⁺ 4 시간 전
Lobste.rs-Meinungen
  • Dass Cargo in Rust 1.97 jetzt die Beziehung zwischen Warnungen und Build-Erfolg steuern kann, ist ein wirklich großartiges neues Feature
    Wenn Warnungen beim Beheben von Fehlern nach einem Refactoring stören, kann man sie mit CARGO_BUILD_WARNINGS=allow cargo check vorübergehend ausblenden, und in CI kann man mit CARGO_BUILD_WARNINGS=deny Warnungen als Fehler behandeln. Zusammen mit --keep-going kann man alle Fehler und Warnungen sammeln, statt beim ersten fehlgeschlagenen Paket stehenzubleiben

  • Es könnte besser sein, mit dem Upgrade noch kurz zu warten. Es scheint einen Miscompile-Bug zu geben
    https://github.com/rust-lang/rust/issues/159035

    • Interessanterweise gab es dieses Miscompile schon seit 10 Releases, aber früher wurde nur leicht außerhalb des Bereichs gelesen, während jetzt offenbar deutlich weiter außerhalb gelesen wird und es dadurch zu einem Segfault kommt
    • Es war ein LLVM-Bug. Glücklicherweise scheint der Fix ziemlich geradlinig zu sein
      https://github.com/llvm/llvm-project/pull/208683
  • Cool. Ich frage mich, ob jemand hier den Fortschritt bei der Implementierung von Pattern Types zusammenfassen kann

  • Schade, der Never Type wurde auch diesmal nicht stabilisiert. Hoffentlich dann im nächsten Release

    • Der Witz, dass der „Never Type“ nach seinem Stabilisierungsdatum benannt wurde, ist inzwischen auch fast auserzählt
    • Eines der Mitglieder des Compiler-Teams hat auf der RustWeek einen Vortrag über den Never Type gehalten. Das könnte helfen, die Aussichten auf eine Stabilisierung besser einzuschätzen, daher empfehle ich, ihn anzusehen: https://www.youtube.com/watch?v=3jM4cnEVrLc