Programmiersprache Rust 1.60 zeigt Codeabdeckung und sieht Zeitspannen positiv

Der Compiler bietet eine Anbindung an die sourcebasierte Codeabdeckung von LLVM. Außerdem stolpert die Sprache nicht mehr über scheinbar negative Zeitspannen.

In Pocket speichern vorlesen Druckansicht 27 Kommentare lesen

(Bild: Callum Bainbridge / Shutterstock.com)

Lesezeit: 4 Min.
Inhaltsverzeichnis

Planmäßig im Sechswochentakt ist Rust 1.60 erschienen. Das aktuelle Release bringt vor allem Ergänzungen in der Toolchain und für den Paketmanager Cargo. Die Sprache selbst erhält keine nennenswerten Ergänzungen, aber das Berechnen von Zeiträumen über Instant funktioniert nun ohne systembedingte Stolpersteine.

Der Compiler arbeitet auch wieder inkrementell, nachdem das inkrementelle Kompilieren in Rust 1.59 deaktiviert worden war aufgrund eines Bugs, der zu Deserialisierungsfehlern führen konnte. Der Fehler ist wohl weitgehend, wenngleich noch nicht vollständig, behoben.

Die Anbindung an die sourcebasierte Codeabdeckung über die Compiler-Infrastruktur LLVM gilt ab sofort als stabil. Sie lässt sich über die Konfiguration -Cinstrument-coverage aktivieren. Das anschließend erstellte Binary generiert beim Ausführen im aktuellen Verzeichnis die Datei default.profraw.

Zum Auswerten der Ergebnisse dient eine Komponente für das Zusammenspiel mit den LLVM-Tools, die sich über das Tool rustup installieren lässt:

rustup component add llvm-tools-preview

Die Komponente enthält llvm-profdata und llvm-cov. Ersteres verarbeitete die Rohdaten der Ausgabe und führt sie zusammen, Letzteres erstellt den Bericht über die Codeabdeckung. Dazu verbindet llvm-cov die Ausgabe von llvm-profdata mit den Informationen im Binary zu den tatsächlichen Bereichen im Sourcecode.

Der Rust-Blog zeigt als Beispiel den Bericht zu einem einfachen Hello-World-Programm mit einer hundertprozentigen Codeabdeckung, in der jede Zeile einmal aktiv war:

    1|      1|fn main() {
    2|      1|    println!("Hello, world!");
    3|      1|}

Auch wenn die Komponente "preview" im Namen trägt, gilt die Integration in den Rust-Compiler rustc als stabil. Der Namenszusatz zeigt jedoch an, dass sich das Tooling und das Ausgabeformat in den kommenden Releases noch ändern könnte.

Die Paketverwaltung Cargo ergänzt den Umgang mit optionalen Dependencies, die nicht standardmäßig, sondern nur bei Bedarf kompiliert werden. Das aktuelle Release bietet dafür Namespaces über das Präfix dep:, um explizit eine optionale Abhängigkeit zu nutzen, ohne sie damit wie bisher automatisch als Feature zu definieren.

Über sogenannt Weak Dependencies mit der Syntax "paket?/feature" lässt sich das in der Zeichenkette hinten stehende Feature nur für den Fall aktivieren, dass die Dependency zu dem vorne aufgeführten Paket bereits von einer anderen Codepassage genutzt wird. Folgendes Beispiel aus dem Blog zeigt beide Neuerungen:

[dependencies]
serde = { version = "1.0.133", optional = true }
rgb = { version = "0.8.25", optional = true }

[features]
serde = ["dep:serde", "rgb?/serde"]

Dabei aktiviert das für die Serialisierung vorgesehene Feature serde die gleichnamige Depency. Zudem aktiviert es das ebenfalls gleichnamige Feature in der rgb-Dependency – allerdings nur, wenn anderer Code die Abhängigkeit nutzt.

In Bezug auf den Paketmanager ist noch erwähnenswert, dass für das Tool cargo das Flag --timings zum Sammeln von Informationen beim Build-Prozess im aktuellen Release als stabil gilt.

Eine Anpassung unter der Haube betrifft das Messen von Zeiträumen über das Struct Instant in der Standard-Library von Rust. Es dient laut Definition zum Messen einer monoton nicht fallenden Zeitangabe (monotonically non decreasing clock). Dazu greift Rust auf die APIs des jeweiligen Betriebssystems zurück.

Allerdings kann es wohl aus unterschiedlichen Gründen wie Fehlern im Betriebssystem, Problemen mit der Hardware oder bei der Virtualisierung zu negativen Werten kommen, was wiederum einen Abbruch des Programms mit panic! auslöst. Der Fehler war für Entwicklerinnen und Entwickler schwer nachvollziehbar, da er von der jeweiligen Konfiguration des Zielsystems abhängt.

Rust 1.60 setzt nach dem Prinzip der Sättigungsarithmetik den Mindestwert für Instant::duration_since, Instant::elapsed und Instant::sub intern auf 0, um den Fehler zu unterbinden.

Weitere Details zu Rust 1.60 lassen sich dem Rust-Blog entnehmen. Wie üblich können Entwicklerinnen und Entwickler, die Rust bereits installiert haben, das aktuelle Release über rustup update stable herunterladen. Für diejenigen, die noch kein Rust verwenden, ist das rustup-Tool auf der Download-Seite separat verfügbar.

Kurz vor dem Release hatte das Rust-Language-Design-Team einen Ausblick auf die nächste Edition der Programmiersprache Rust 2024 veröffentlicht.

(rme)