Zum Inhalt springen

Rust 1.100 bringt den Never-Typ, eigene Allocators und Cargo-Lints

Rust 1.100.0 erschien am 12. November. In einem Test von Tech AI Wire baut Code, der den Never-Typ-Lint unter Rust 1.99 stummschaltete, unter 1.100 nicht mehr.

Von

4 Min. Lesezeit

XLinkedIn

Maschinell übersetzt aus dem englischen Original, das Claire Whitmore auf Fakten geprüft und redigiert hat. Es gilt die englische Fassung. So arbeiten wir

Screenshot of the Rust Blog post 'Announcing Rust 1.100.0', dated November 12, 2026 and signed by the Rust Release Team, showing the rustup update stable command.

Die Zahlen

Veröffentlichung von Rust 1.100.0
12. Nov. 2026
war der Never-Typ vor diesem Release instabil
10 Jahre
Mindestalter für Veröffentlichungen in Cargos eigener Beispielkonfiguration
3 Tage

Das Rust-Projekt hat Rust 1.100.0 am 12. November 2026 veröffentlicht. Es macht den Never-Typ stabil, öffnet den Kern der API für eigene Allocators und bringt Cargo bei, vor ungenutzten Abhängigkeiten zu warnen. Die Änderung am Never-Typ ist zugleich ein Breaking Change, und die Release Notes führen sie unter "Compatibility Notes". Projekte jeder Edition können nun dort am Build scheitern, wo sie vorher kompilierten.

Laut der Ankündigung im Rust Blog brauchte der Never-Typ 10 Jahre und 5 gescheiterte Anläufe, um stabil zu werden. LWN.net stellte dieselben drei Änderungen an den Anfang: den Never-Typ, den Kern der Allocator API und Cargos Bericht über ungenutzte Abhängigkeiten. Rust-Nutzer aktualisieren mit rustup update stable.

Was in Rust 1.100 neu ist

Der Never-Typ, geschrieben !, ist der Typ von Code, der nie fertig wird, etwa ein panic! oder eine Endlosschleife. Bisher durfte er nur als Rückgabetyp einer Funktion stehen. Unser Leitfaden zum Never-Typ in Rust erklärt ihn ausführlich, und unser Artikel aus dem August behandelte den Pull Request, der ihn stabil machte.

Die Tabelle unten stützt sich auf den Blogpost, die Release Notes auf GitHub und das Cargo-Changelog.

ÄnderungWas sie bewirktWer es merkt
Never-Typ !Überall nutzbar, etwa in Result<T, !>; Infallible wird ein Alias für !Code, der sich auf den alten Fallback verließ
Typ-FallbackEin unbekannter Typ in einem divergierenden Zweig wird jetzt in allen Editions zu ! statt ()Ältere Crates, die nie auf Edition 2024 umgestiegen sind
Allocator APIAllocator, Global, System sowie Vec::new_in, Box::new_in und ähnliche MethodenCode, der seinen Speicher selbst verwaltet
cargo::unused_dependenciesWarnt, wenn eine Abhängigkeit in Cargo.toml nie genutzt wirdJedes Cargo-Projekt
Mindestalter für VeröffentlichungenCargo kann Crate-Versionen überspringen, die jünger als ein festgelegtes Alter sindTeams, die Supply-Chain-Angriffe fürchten
Layout des Build-VerzeichnissesZwischendateien des Builds ziehen umSkripte, die Cargos target-Ordner direkt lesen
i686-pc-windows-gnuJetzt Tier 2 ohne Host-ToolsNutzer von 32-Bit-Windows

Die Änderung für 32-Bit-Windows wurde im Oktober angekündigt, wie unser Artikel zu den i686-Targets erklärt. Das Release stabilisiert auch kleinere Helfer wie bool::toggle, Vec::from_fn und str::trim_prefix.

Test von Tech AI Wire: Rust 1.99.1 gegen 1.100.0

In einem Test von Tech AI Wire unter macOS 26.6.2 liefen dieselben kleinen Projekte in den offiziellen Docker-Images rust:1.99-slim und rust:1.100-slim. Beide sind Debian 13 auf arm64. Die Images meldeten rustc 1.99.1 und rustc 1.100.0.

Das erste Projekt nutzte Edition 2021 und diesen Code:

fn make<T: Default>() -> Result<T, ()> {
    Ok(T::default())
}

fn main() -> Result<(), ()> {
    make()?;
    Ok(())
}

Nichts sagt dem Compiler, was T ist, also greift er auf einen Standardtyp zurück. Das machte jede Version daraus:

CodeRust 1.99.1Rust 1.100.0
Wie geschriebenFehler durch den Lint dependency_on_unit_never_type_fallbackFehler E0277: "the trait bound !: Default is not satisfied" (die Trait-Schranke !: Default ist nicht erfüllt)
Mit #![allow(dependency_on_unit_never_type_fallback)]Baut und läuftWeiterhin Fehler E0277; der Lint "has been removed" (wurde entfernt)
Mit make::<()>()?Baut und läuftBaut und läuft

Die mittlere Zeile ist die Falle. Ein Crate, das die Warnung unter 1.99 stummschaltete, baut dort und scheitert dann unter 1.100. Rust 1.100 begründet die Entfernung des Lints damit, dass "the code warned by this lint no longer compiles" (der Code, vor dem dieser Lint warnte, kompiliert nicht mehr). Nur das Ausschreiben des Typs behebt es.

Der Test für eigene Allocators umhüllte den globalen Allocator, um Anfragen zu zählen. Unter 1.99.1 scheiterte er mit Fehler E0658, "use of unstable library feature allocator_api". Unter 1.100.0 lief er auf Stable. Ein Vec mit 1.000 Zahlen plus ein Box lösten 10 Allokationsaufrufe für 16.356 Bytes aus.

Test von Tech AI Wire: Cargos zwei neue Sicherheitsprüfungen

Ein Crate (ein Rust-Paket) führte itoa und memchr als Abhängigkeiten, nutzte aber nur itoa. Unter 1.100 gab cargo build "warning: unused dependency memchr" aus. Mit unused_dependencies = "deny" unter [lints.cargo] wurde daraus ein Fehler, und der Build brach ab. Eine nie genutzte Dev-Dependency bekam keine Warnung. Ebenso wenig cargo check --bin unused, das ein einzelnes Target prüft. Beides entspricht Ausnahmen, die der Blogpost aufführt. Rust 1.99.1 ignorierte die Tabelle [lints.cargo] mit der Warnung "unused manifest key".

Das Mindestalter für Veröffentlichungen verzögert brandneue Crate-Versionen, was der Blogpost "dependency cooldowns" nennt. Die Wartezeit gibt anderen Zeit, ein fehlerhaftes Release zu entdecken, bevor Ihr Build es einzieht. Mit global-min-publish-age = "3 days" unter [registry] legte Cargo cc auf 1.11.1 fest. Es meldete "available: v1.11.2, published 2 hours ago". Ohne die Einstellung wählte Cargo 1.11.2. Mit 30 Tagen schlug die Auflösung fehl, weil cargo add bereits 1.11.1 als Mindestversion eingetragen hatte. Cargo schlug vor, die Anforderung auf "1.8.0" zu senken oder CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow zu setzen.

Was das für Entwickler bedeutet

  • Bauen Sie jedes Crate mit 1.100, bevor Sie die CI umstellen. Code aus älteren Editions bricht am ehesten. Suchen Sie nach allow(dependency_on_unit_never_type_fallback), denn dieser Code scheitert unter 1.100.
  • Beheben Sie Fallback-Fehler, indem Sie den Typ ausschreiben. Der eigene Vorschlag des Compilers, etwa make::<()>(), funktionierte im Test auf beiden Versionen.
  • Schalten Sie das Mindestalter jetzt ein. Drei Tage global-min-publish-age in .cargo/config.toml kosten wenig. Setzen Sie es, bevor Sie cargo add ausführen, denn dieser Befehl schreibt die gewählte Version in Cargo.toml.
  • Räumen Sie ungenutzte Abhängigkeiten auf, bevor Sie sie verbieten. Beginnen Sie beim Standard warn, entfernen Sie, was er findet, und stellen Sie dann in der CI auf deny um.
  • Lesen Sie die Compatibility Notes. Sie nennen auch entfernte box-Patterns, Unicode 18.0.0 und strengere Prüfungen von ARM-Target-Features.
  • Lesen Sie Cargos Build-Ordner nicht mehr direkt. Ihr Layout hat sich in 1.100 geändert, und laut Cargo-Changelog sollen Tools stattdessen Cargos JSON-Meldungen nutzen.

Quellen

  1. Announcing Rust 1.100.0 - Rust Blog
  2. Rust 1.100.0 release notes - GitHub - rust-lang/rust
  3. Cargo changelog: Cargo 1.100 - The Cargo Book
  4. Rust 1.100.0 released - LWN.net
rustcompilerssupply-chain

Ähnliche Artikel