Die neue Version der Programmiersprache Rust 1.58, ursprünglich von Mozilla entwickelt und jetzt von der unabhängigen Non-Profit-Organisation Rust Foundation betreut, wurde veröffentlicht. Die Sprache konzentriert sich auf sichere Speicherverwaltung, bietet automatisches Gedächtnismanagement und ermöglicht eine hohe Parallelität bei der Ausführung von Aufgaben, ganz ohne Garbage Collector und Runtime (die Runtime beschränkt sich auf die grundlegende Initialisierung und die Unterstützung der Standardbibliothek).
Das automatische Speichermanagement in Rust befreit Entwickler von Fehlern beim Umgang mit Zeigern und schützt vor Problemen, die aus der niederen Speicherverwaltung entstehen, wie etwa dem Zugreifen auf Speicherbereiche nach deren Freigabe, dem Dereferenzieren von Nullzeigern, Pufferüberläufen usw. Zur Verbreitung von Bibliotheken, zur Gewährleistung des Builds und zur Verwaltung der Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für die Bereitstellung von Bibliotheken wird das Repository crates.io unterstützt.
Hauptneuheiten:
- In den Formatierungsblöcken für Zeichenfolgen wurde neben der bereits verfügbaren Möglichkeit, nach dem Namen und der Nummer aufgelistete Variablen zu ersetzen, die Option eingeführt, beliebige Identifikatoren durch das Hinzufügen des Ausdrucks "{identifikator}" in die Zeichenfolge einzufügen. Zum Beispiel: // Früher unterstützte Konstrukte: println!("Hello, {}!", get_person()); println!("Hello, {0}!", get_person()); println!("Hello, {person}!"); // jetzt kann angegeben werden let person = get_person(); println!("Hello, {person}!");
Identifikatoren können auch direkt in den Formatierungsparametern angegeben werden. let (width, precision) = get_format(); for (name, score) in get_scores() { println!("{name}: {score:width$.precision$}"); }
Der neue Platzhalter funktioniert in allen Makros, die die Formatierung von Zeichenfolgen unterstützen, mit Ausnahme des Makros „panic!“ in den Rust-Sprachversionen 2015 und 2018, in denen panic!("{ident}") als normale Zeichenfolge behandelt wird (in Rust 2021 funktioniert der Platzhalter).
- Das Verhalten der Struktur std::process::Command auf der Windows-Plattform wurde geändert: Bei der Ausführung von Befehlen sucht sie aus Sicherheitsgründen nicht mehr nach ausführbaren Dateien im aktuellen Verzeichnis. Das aktuelle Verzeichnis wurde ausgeschlossen, da es zur Ausführung von schadhafterm Code verwendet werden könnte, wenn Programme in nicht vertrauenswürdigen Verzeichnissen gestartet werden (CVE-2021-3013). Die neue Logik zur Bestimmung ausführbarer Dateien sieht die Suche in den Rust-Verzeichnissen, im Anwendungsverzeichnis, im Windows-Systemverzeichnis und in den Verzeichnissen vor, die in der Umgebungsvariable PATH angegeben sind.
- In der Standardbibliothek wurde die Anzahl der mit „#[must_use]“ gekennzeichneten Funktionen erweitert, um Warnungen auszugeben, falls der Rückgabewert ignoriert wird. Dies hilft, Fehler zu erkennen, die durch die Annahme verursacht werden, dass eine Funktion Werte ändert, anstatt einen neuen Wert zurückzugeben.
- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von Traits:
- Metadata::is_symlink
- Path::is_symlink
- {integer}::saturating_div
- Option::unwrap_unchecked
- Result::unwrap_unchecked
- Result::unwrap_err_unchecked
- Das „const“-Merkmal, das die Verwendung in jedem Kontext anstelle von Konstanten ermöglicht, wurde in den Funktionen angewendet:
- Duration::new
- Duration::checked_add
- Duration::saturating_add
- Duration::checked_sub
- Duration::saturating_sub
- Duration::checked_mul
- Duration::saturating_mul
- Duration::checked_div
- Das Dereferenzieren von Zeigern „*const T“ wird in „const“-Kontexten erlaubt.
- Im Paketmanager Cargo wurde dem Paket-Metadatenfeld rust_version hinzugefügt, und der Befehl „cargo install“ erhielt die Option „—message-format“.
- Im Compiler wurde die Unterstützung für den CFI (Control Flow Integrity)-Schutzmechanismus implementiert, der vor jedem indirekten Funktionsaufruf Prüfungen hinzufügt, um bestimmte Formen von undefiniertem Verhalten zu erkennen, die potenziell die normale Ausführungsreihenfolge (control flow) durch die Anwendung von Exploits, die im Speicher gespeicherte Funktionszeiger verändern, stören könnten.
- Im Compiler wurde die Unterstützung für die Versionen 5 und 6 des LLVM-Coverage-Mappings hinzugefügt, die zur Bewertung der Codeabdeckung während des Testens verwendet werden.
- Im Compiler wurden die Anforderungen an die minimale LLVM-Version auf LLVM 12 angehoben.
- Der dritte Unterstützungslevel für die Plattform x86_64-unknown-none wurde implementiert. Dieser Level bietet grundlegende Unterstützung, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds und Verifizierung der Code-Kompatibilität.
Zusätzlich gibt es die Veröffentlichung von Microsoft der Rust for Windows-Bibliotheken 0.30, die die Nutzung der Programmiersprache Rust zur Entwicklung von Anwendungen für das Betriebssystem Windows ermöglichen. Das Paket umfasst zwei Crate-Pakete (windows und windows-sys), über die auf die Win API in Rust-Programmen zugegriffen werden kann. Der Code zur Unterstützung der API wird dynamisch aus Metadaten generiert, die die API beschreiben. Dadurch wird unterstützt, nicht nur bestehende Win API-Aufrufe zu implementieren, sondern auch zukünftige Aufrufe. In der neuen Version wurde die Unterstützung für die Zielplattform UWP (Universal Windows Platform) hinzugefügt, und die Typen Handle und Debug wurden implementiert.
Quelle: opennet.ru
