Rust 1.99 stabilisiert die Definition von C-variadic-Funktionen
Rust 1.99.0, erschienen am 1. Oktober 2026, erlaubt in stabilem Rust die Definition von C-variadic-Funktionen wie printf, wechselt auf LLVM 23 und macht no_mangle bei Generics zum Fehler.
4 Min. Lesezeit

Die Zahlen
- new code-generation backend
- LLVM 23
- average Rustdoc speedup on trait impl filtering
- 20%
- best-case Rustdoc speedup on some crates
- 40%
- release that first warned about no_mangle on generics
- 1.56
Das Rust-Team hat Rust 1.99.0 am 1. Oktober 2026 veröffentlicht. Die wichtigste Neuerung: Stabiles Rust kann jetzt C-variadic-Funktionen definieren, also Funktionen, die beliebig viele Argumente annehmen, wie printf in C. Das schließt eine Lücke für Rust-Code, der eng mit C zusammenarbeiten muss.
Das Release stellt den Compiler außerdem auf LLVM 23 um, beschleunigt das Dokumentationswerkzeug und macht aus einer seit Langem bestehenden Warnung einen harten Fehler.
Was die C-variadic-Definitionen bringen
Eine variadische Funktion nimmt eine variable Anzahl von Argumenten an. C nutzt sie häufig, und Rust kann sie schon lange aufrufen. Eine solche Funktion in Rust zu definieren, war etwas anderes. "Rust konnte bereits extern definierte variadische Funktionen aufrufen (z. B. libc::printf). Mit Rust 1.99 können diese Funktionen jetzt in Rust selbst geschrieben werden", heißt es in der offiziellen Ankündigung.
Die Syntax verwendet ... als letzten Parameter. ByteIOTA gibt die Form einer Definition als unsafe extern "C" fn my_logger(count: u32, mut args: ...) -> i32 an. Innerhalb der Funktion kommen die zusätzlichen Argumente als core::ffi::VaList an, der laut dem Rust-Blog auf Binärebene mit dem C-Typ va_list kompatibel ist. Linux Compatible berichtet, dass Code jedes Argument mit next_arg::<T>() liest.
Ein Trait namens VaArgSafe regelt, welche Typen durchgereicht werden dürfen. Er kennzeichnet die Typen, die sicher aus der Argumentliste gelesen werden können, und hilft so, Typkonflikte zu vermeiden. Laut dem Rust-Blog und releases.rs können mit dem Release auch Naked Functions variadische Signaturen verwenden. Eine Naked Function ist eine Funktion, die der Compiler ohne Setup-Code ausgibt. Low-Level- und Embedded-Code nutzt sie, um die Aufrufkonvention genau zu steuern.
Neu stabilisierte Bibliotheks-APIs
Der Rust-Blog nennt unter anderem diese APIs, die jetzt in Stable verfügbar sind:
- Speicherlayout:
Layout::for_value_raw,mem::size_of_val_raw,mem::align_of_val_raw - Collections und Boxen:
Box::into_non_null,Vec::into_parts,Vec::from_parts,VecDeque::retain_back - Dateisystem:
std::fs::set_times,std::fs::set_times_nofollow
Die set_times-Funktionen ändern die Zeitstempel einer Datei direkt aus der Standardbibliothek heraus. Wie der Name schon sagt, folgt die Variante _nofollow keinen symbolischen Links.
Änderungen an Compiler, Plattformen und Werkzeugen
Rust 1.99 wechselt auf LLVM 23, die Codegenerierungsbibliothek, die Rust in Maschinencode übersetzt. ByteIOTA berichtet über die Benchmarks hinweg von einer im Mittel um 1,2 % kürzeren tatsächlichen Kompilierzeit, als Teil eines Gewinns von 4,57 % über zwei Monate.
Weitere Änderungen laut Linux Compatible und releases.rs:
| Bereich | Änderung |
|---|---|
| Plattformen | RISC-V 64-Bit-Linux mit musl steigt in den Tier-2-Support auf |
| Linken | Statische positionsunabhängige Executables sind auf GNU- und musl-Targets aktiviert |
| Rustdoc | Das Filtern von Trait-Implementierungen ist im Schnitt etwa 20 % schneller, bei einigen Crates bis zu 40 % |
| Makros | Attributmakros funktionieren jetzt bei ausgelagerten Modulen wie #[my_macro] mod foo; |
| Inline-Assembly | 128-Bit-Ganzzahlen können auf x86 in Vektorregistern übergeben werden |
Cargo, das Build-Werkzeug von Rust, erhält drei Änderungen. Es reserviert ein neues debug-Profil, das releases.rs als Vorbereitung darauf beschreibt, das dev-Profil vom Debugging wegzubewegen, "um einen vernünftigeren Standard zu schaffen". Es schaltet die inkrementelle Kompilierung ab, wenn die Umgebungsvariable CI gesetzt ist, und ByteIOTA merkt an, dass CARGO_INCREMENTAL=1 sie wieder einschaltet. Workspace-Mitglieder mit der Edition 2024 können außerdem geerbte Standardwerte für Abhängigkeiten überschreiben.
Was kaputtgehen könnte
Das Release bringt mehrere Kompatibilitätsänderungen mit:
| Änderung | Detail |
|---|---|
#[no_mangle] bei generischen Elementen | Jetzt ein harter Fehler; laut ByteIOTA gab es dafür seit Rust 1.56 eine Warnung |
| Legacy-Ganzzahlmodule | Jetzt vollständig als veraltet markiert |
| Extern-Statics | Borrows werden nicht mehr automatisch zu 'static hochgestuft, berichtet ByteIOTA |
| Codeblöcke in Doc-Kommentaren | Attribute darin brauchen gültige Ziele, sonst schlägt der Doc-Build fehl |
RangeInclusive | Die Iteration ist besser optimiert, was das Verhalten eines bereits erschöpften Bereichs ändert |
Pin::new_unchecked | Seine Sicherheitsregeln sind genauer ausformuliert |
Das ist der jüngste Schritt in einem ereignisreichen Jahr für die Sprache. Im August hat Rust den Never-Type nach zehn Jahren stabilisiert, und Nightly-Builds haben den Trait-Solver der nächsten Generation eingeschaltet.
Was das für Entwickler bedeutet
Löschen Sie Ihre printf-Shims. Wenn Sie C-Code geschrieben oder ein Nightly-Feature genutzt haben, nur um variadische Argumente von einem C-Aufrufer anzunehmen, geht das jetzt in stabilem Rust. Plugin-Hosts, eigene Allokatoren und Logging-Brücken sind die naheliegenden Stellen, an denen Sie nachsehen sollten.
Prüfen Sie generischen Code vor dem Upgrade auf #[no_mangle]. Seit Rust 1.56 gab es dafür eine Warnung, also schlägt ein Crate, das mit dieser Warnung noch kompiliert, jetzt fehl. Durchsuchen Sie Ihre Codebasis und Ihre vendorten Abhängigkeiten nach dem Attribut an generischen Funktionen.
Behalten Sie Ihre CI-Build-Zeiten im Blick. Cargo schaltet die inkrementelle Kompilierung jetzt ab, wenn CI gesetzt ist. Für saubere Builds ist das meist die richtige Entscheidung, aber ein CI-Setup, das das Target-Verzeichnis zwischen Läufen zwischenspeichert, kann langsamer werden. Setzen Sie CARGO_INCREMENTAL=1, wenn Ihre eigenen Messungen dafür sprechen.
Führen Sie Ihre Doc-Tests aus. Veraltete Attribute in Codeblöcken in Doc-Kommentaren lassen den Doc-Build jetzt fehlschlagen. Führen Sie cargo test --doc frühzeitig aus, damit ein kaputtes Beispiel kein Release blockiert.
Testen Sie Code, der abgeschlossene Bereiche wiederverwendet. Die Änderung an RangeInclusive betrifft nur Bereiche, die bereits bis zum Ende durchlaufen wurden. Code, der einen solchen Bereich nach der Schleife weiterverwendet, sollte gegen das neue Verhalten geprüft werden.
Quellen
- Announcing Rust 1.99.0 - Rust Blog
- Rust 1.99.0 Ships with Stable C-Variadic Functions - Linux Compatible
- Rust 1.99 Is Out: C-Variadics and What Breaks - ByteIOTA
- 1.99.0 - releases.rs
Ähnliche Artikel

Molds Rust-Neufassung will Linux' Standard-Linker werden
Mold linkt laut eigenem Repository 4,9-mal schneller als LLVM lld. Sein Autor schreibt das Werkzeug in Rust neu und will, dass Distributionen es als /usr/bin/ld installieren.

Zig 0.17.0 bringt ein geteiltes Build-System und schnelle Rebuilds
Zig 0.17.0 erschien am 2. Oktober mit 925 Commits von 206 Beitragenden: ein überarbeitetes Build-System, inkrementelle Builds unter x86_64 Linux und LLVM 22.1.8.

Rust 1.100 streicht Host-Tools für 32-Bit-Windows-Ziele
Rust 1.100 liefert keinen Compiler mehr für 32-Bit-Windows aus. Die i686-Ziele behalten die Standardbibliothek, sodass Cross-Compiling von 64-Bit-Windows weiter funktioniert.