Rust 1.96.0 veröffentlicht
(blog.rust-lang.org)- Rust 1.96.0 kann mit
rustup update stableinstalliert werden; an der Überprüfung künftiger Releases kann über die Beta-/Nightly-Kanäle teilgenommen werden - Die neuen Typen
core::range::Range*implementieren IntoIterator stattIterator, sodass sieCopyimplementieren können, und sollen künftig die Standardtypen für die Bereichssyntax werden - assert_matches! und
debug_assert_matches!geben bei einer fehlgeschlagenen Musterübereinstimmung zusätzlich dieDebug-Darstellung des Werts aus und erleichtern so die Diagnose von Testfehlschlägen - Für WebAssembly-Targets wird
--allow-undefinednicht mehr standardmäßig übergeben, sodass undefinierte Symbole nicht mehr zu Imports, sondern zu Linker-Fehlern führen - Cargo enthält Korrekturen für CVE-2026-5223 und
CVE-2026-5222für Nutzer von Drittanbieter-Registries; Nutzer von crates.io sind nicht betroffen
Wichtige Änderungen in Rust 1.96.0
-
Updates und Testkanäle
- Nutzer, die Rust bereits mit
rustupinstalliert haben, können Rust 1.96.0 mitrustup update stableerhalten - Falls
rustupnicht vorhanden ist, kann es über dierustup-Installationsseite der Rust-Website installiert werden; außerdem ist die ausführliche1.96.0-Release-Note veröffentlicht - Wer an der Validierung künftiger Releases teilnehmen möchte, kann mit
rustup default betaoderrustup default nightlydie Beta-/Nightly-Kanäle verwenden; Bugs können im Rust-Issue-Tracker gemeldet werden
- Nutzer, die Rust bereits mit
-
Neue
Range*-Typen- Bei den bisherigen
Range- und zugehörigencore::ops-Typen erwarten viele NutzerCopy, sie implementierten dies jedoch nicht, weil sie direktIteratorimplementieren - Die gleichzeitige Implementierung von
IteratorundCopyfür denselben Typ gilt als von Clippy beanstandete footgun und wurde daher vermieden - RFC3550 schlägt alternative Bereichstypen vor, die statt
IteratorIntoIteratorimplementieren; in dieser Struktur können die betreffenden Typen auchCopyimplementieren - In der Standardbibliothek wurden
core::range::Range,core::range::RangeFrom,core::range::RangeInclusiveund zugehörige Iteratoren stabilisiert - In einer nahen zukünftigen Rust-Version sollen außerdem
core::range::RangeFullundcore::range::RangeTo, die auscore::opserneut exportiert werden, sowiecore::range::legacy::*hinzukommen, das der neue Ort der aktuellen Bereichstypen wird - Bereichssyntax wie
0..1erzeugt derzeit noch Legacy-Typen, soll in einer künftigen Edition aber aufcore::range-Typen umgestellt werden - Durch die neue Stabilisierung können Slice-Indizes in
Copy-Typen gespeichert werden, ohnestartundendgetrennt halten zu müssen - Beispiel:
use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } } - Das neue
RangeInclusivemacht seine Felder öffentlich, da anders als bei der Legacy-Version kein offengelegter Zustand eines erschöpften Iterators vermieden werden muss - Da die neuen Typen vor dem Iterieren erst umgewandelt werden müssen, sind öffentliche Felder kein Problem
- Autoren von Bibliotheken sollten für öffentliche APIs die Verwendung von
impl RangeBoundserwägen, damit sowohl Legacy- als auch neue Bereichstypen akzeptiert werden - Wenn ein konkreter Typ benötigt wird, wird empfohlen, den neuen Bereichstyp zu bevorzugen, der künftig der Standard sein soll
- Bei den bisherigen
-
Assertion-Makros für Pattern Matching
- Die neuen Makros
assert_matches!unddebug_assert_matches!prüfen, ob ein Wert auf ein gegebenes Muster passt, und panicen andernfalls zusammen mit derDebug-Darstellung des betreffenden Werts - Beide Makros entsprechen im Wesentlichen
assert!(matches!(..))bzw.debug_assert!(matches!(..)), verbessern aber durch die Ausgabe des Werts bei einem Fehlschlag die Diagnosefähigkeit - Wegen möglicher Konflikte mit populären Drittanbieter-Crates, die Makros mit demselben Namen bereitstellen, wurden sie nicht dem Standard-Prelude hinzugefügt
- Vor der Verwendung müssen sie direkt aus
coreoderstdimportiert werden - Beispiel:
use core::assert_matches; /// [Random Number](https://xkcd.com/221/) fn get_random_number() -> u32 { // chosen by a fair dice roll. // guaranteed to be random. 4 } fn main() { assert_matches!(get_random_number(), 1..=6); }
- Die neuen Makros
-
Änderungen bei WebAssembly-Targets
- Für WebAssembly-Targets wird
--allow-undefinednicht mehr an den Linker übergeben - Undefinierte Symbole beim Linken werden nicht mehr in WebAssembly-Imports aus dem Modul
"env"umgewandelt, sondern führen zu Linker-Fehlern - Wenn alle linkrelevanten Symbole definiert sein müssen, wird das Modul sonst nicht gelinkt, wodurch Bugs früher erkannt und versehentliche Probleme etwa bei Symbolnamen vermieden werden können
- Undefinierte linkrelevante Symbole deuten meist auf Bugs zur Build-Zeit oder Konfigurationsfehler hin
- Falls das bisherige Verhalten beabsichtigt war, kann es mit
RUSTFLAGS=-Clink-arg=--allow-undefinedwiederhergestellt werden; alternativ kann im Quellcode#[link(wasm_import_module = "env")]in dem Block verwendet werden, der das Symbol definiert - Diese Änderung wird nach einer früheren Ankündigung im Blog mit Rust 1.96 wirksam
- Für WebAssembly-Targets wird
Stabilisierte APIs und Sicherheitskorrekturen
-
Stabilisierte APIs
-
Zwei Cargo-Sicherheitshinweise
- Rust 1.96 enthält Korrekturen für zwei Cargo-Schwachstellen für Nutzer von Drittanbieter-Registries
- CVE-2026-5223 ist eine Schwachstelle mit mittlerem Schweregrad im Zusammenhang mit dem Entpacken von Crate-Tarballs mit symbolischen Links
- CVE-2026-5222 ist eine Schwachstelle mit niedrigem Schweregrad im Zusammenhang mit Authentifizierung über normalisierte URLs
- Nutzer von crates.io sind von beiden Schwachstellen nicht betroffen
-
Weitere Änderungen
1 Kommentare
Lobste.rs-Meinungen
assert_matchesist etwas, das ich immer wieder haben möchte, und jedes Mal frage ich mich, ob ich dafür ein neues Crate hinzufügen oder es selbst erneut implementieren sollDeshalb freue ich mich, dass es in die Standardbibliothek aufgenommen wird
Mir gefällt der Schritt, Bereiche zu
Copy-Typen zu machenIch war gelegentlich überrascht, dass ich Bereiche klonen musste, und es passt auch besser zur Intuition, dass
12..34kleine, kopierbare Daten sein solltenWenn es allerdings mehrere Typen mit demselben Namen gibt, mache ich mir ein wenig Sorgen, dass VS Code beim nächsten automatischen Ergänzen einer
use-Deklaration den falschen Typ importiertFür die meisten Nutzer ist der Vorteil der neuen Typen gering, daher können sie einfach weiterhin die bestehenden Typen verwenden, und an der Grenze zur nächsten Edition werden dann automatisch die neuen Typen genutzt
Explizit importieren werden sie vermutlich vor allem Bibliotheksautoren, die beide Versionen ausdrücklich unterstützen wollen
Man kann das Prelude ändern, ohne bestehende Projekte kaputtzumachen