Zum Inhalt springen

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.

Von Tech AI Wire Team

4 Min. Lesezeit

XLinkedIn
Screenshot of the Rust Blog post 'Announcing Rust 1.99.0', dated October 1, 2026, from the Rust Release Team.

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
PlattformenRISC-V 64-Bit-Linux mit musl steigt in den Tier-2-Support auf
LinkenStatische positionsunabhängige Executables sind auf GNU- und musl-Targets aktiviert
RustdocDas Filtern von Trait-Implementierungen ist im Schnitt etwa 20 % schneller, bei einigen Crates bis zu 40 %
MakrosAttributmakros funktionieren jetzt bei ausgelagerten Modulen wie #[my_macro] mod foo;
Inline-Assembly128-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:

ÄnderungDetail
#[no_mangle] bei generischen ElementenJetzt ein harter Fehler; laut ByteIOTA gab es dafür seit Rust 1.56 eine Warnung
Legacy-GanzzahlmoduleJetzt vollständig als veraltet markiert
Extern-StaticsBorrows werden nicht mehr automatisch zu 'static hochgestuft, berichtet ByteIOTA
Codeblöcke in Doc-KommentarenAttribute darin brauchen gültige Ziele, sonst schlägt der Doc-Build fehl
RangeInclusiveDie Iteration ist besser optimiert, was das Verhalten eines bereits erschöpften Bereichs ändert
Pin::new_uncheckedSeine 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

  1. Announcing Rust 1.99.0 - Rust Blog
  2. Rust 1.99.0 Ships with Stable C-Variadic Functions - Linux Compatible
  3. Rust 1.99 Is Out: C-Variadics and What Breaks - ByteIOTA
  4. 1.99.0 - releases.rs

Ähnliche Artikel