Veröffentlichung der Programmiersprache Rust 1.58

Die Veröffentlichung der universellen Programmiersprache Rust 1.58, die vom Mozilla-Projekt gegründet wurde, jetzt aber unter der Schirmherrschaft der unabhängigen gemeinnützigen Organisation Rust Foundation entwickelt wird, wurde veröffentlicht. Die Sprache konzentriert sich auf Speichersicherheit, bietet automatische Speicherverwaltung und bietet die Möglichkeit, eine hohe Aufgabenparallelität zu erreichen, ohne einen Garbage Collector oder eine Laufzeit zu verwenden (die Laufzeit beschränkt sich auf die grundlegende Initialisierung und Wartung der Standardbibliothek).

Die automatische Speicherverwaltung von Rust bewahrt den Entwickler vor Fehlern bei der Manipulation von Zeigern und schützt vor Problemen, die durch Speichermanipulation auf niedriger Ebene entstehen, wie z. B. Zugriff auf einen Speicherbereich, nachdem dieser freigegeben wurde, Dereferenzierung von Nullzeigern, Pufferüberläufe usw. Um Bibliotheken zu verteilen, Builds bereitzustellen und Abhängigkeiten zu verwalten, entwickelt das Projekt den Cargo-Paketmanager. Das crates.io-Repository wird zum Hosten von Bibliotheken unterstützt.

Wichtigste Neuerungen:

  • In Zeilenformatierungsblöcken ist zusätzlich zu der bisher verfügbaren Möglichkeit, Variablen, die explizit nach einer Zeile aufgeführt sind, durch Nummer und Namen zu ersetzen, die Möglichkeit implementiert, beliebige Bezeichner durch Hinzufügen des Ausdrucks „{identifier}“ zur Zeile zu ersetzen. Zum Beispiel: // Zuvor unterstützte Konstruktionen: println!("Hallo, {}!", get_person()); println!("Hallo, {0}!", get_person()); println!("Hallo, {person}!", person = get_person()); // jetzt können Sie let person = get_person(); angeben println!("Hallo, {person}!");

    Bezeichner können auch direkt in den Formatierungsoptionen angegeben werden. let (width, precision) = get_format(); for (Name, Score) in get_scores() { println!("{name}: {score:width$.precision$}"); }

    Die neue Ersetzung funktioniert in allen Makros, die die Definition von Zeichenfolgenformaten unterstützen, mit Ausnahme des „Panic!“-Makros. in den Versionen 2015 und 2018 der Rust-Sprache, in denen panic!("{ident}") als reguläre Zeichenfolge behandelt wird (in Rust 2021 funktioniert die Ersetzung).

  • Das Verhalten der std::process::Command-Struktur auf der Windows-Plattform wurde geändert, sodass bei der Ausführung von Befehlen aus Sicherheitsgründen nicht mehr nach ausführbaren Dateien im aktuellen Verzeichnis gesucht wird. Das aktuelle Verzeichnis ist ausgeschlossen, da es zur Ausführung von Schadcode verwendet werden könnte, wenn Programme in nicht vertrauenswürdigen Verzeichnissen ausgeführt werden (CVE-2021-3013). Die neue Erkennungslogik für ausführbare Dateien umfasst das Durchsuchen der Rust-Verzeichnisse, des Anwendungsverzeichnisses, des Windows-Systemverzeichnisses und der in der Umgebungsvariablen PATH angegebenen Verzeichnisse.
  • Die Standardbibliothek hat die Anzahl der mit „#[must_use]“ gekennzeichneten Funktionen erweitert, um eine Warnung auszugeben, wenn der Rückgabewert ignoriert wird. Dies hilft bei der Identifizierung von Fehlern, die durch die Annahme entstehen, dass eine Funktion Werte ändert, anstatt einen neuen Wert zurückzugeben.
  • Ein neuer Teil der API wurde in die Kategorie „stabil“ verschoben, einschließlich der Stabilisierung der Methoden und Implementierungen von Merkmalen:
    • Metadata::is_symlink
    • Pfad::is_symlink
    • {integer}::saturating_div
    • Option::unwrap_unchecked
    • Ergebnis::unwrap_unchecked
    • Ergebnis::unwrap_err_unchecked
  • Das Attribut „const“, das die Möglichkeit der Verwendung in jedem Kontext anstelle von Konstanten bestimmt, wird in Funktionen verwendet:
    • Dauer::neu
    • Dauer::checked_add
    • Dauer::saturating_add
    • Dauer::checked_sub
    • Dauer::saturating_sub
    • Dauer::checked_mul
    • Dauer::saturating_mul
    • Dauer::checked_div
  • Erlaubte Dereferenzierung von „*const T“-Zeigern in „const“-Kontexten.
  • Im Cargo-Paketmanager wurde das Feld rust_version zu den Paketmetadaten hinzugefügt und die Option „--message-format“ wurde zum Befehl „cargo install“ hinzugefügt.
  • Der Compiler implementiert Unterstützung für den CFI-Schutzmechanismus (Control Flow Integrity), der vor jedem indirekten Aufruf Prüfungen hinzufügt, um einige Formen undefinierten Verhaltens zu erkennen, das möglicherweise zu einer Verletzung der normalen Ausführungsreihenfolge (Kontrollfluss) führen könnte Verwendung von Exploits, die im Speicher gespeicherte Zeiger auf Funktionen ändern.
  • Der Compiler hat Unterstützung für die Versionen 5 und 6 des LLVM-Abdeckungsvergleichsformats hinzugefügt, das zur Bewertung der Codeabdeckung während des Tests verwendet wird.
  • Im Compiler werden die Anforderungen für die Mindestversion von LLVM auf LLVM 12 angehoben.
  • Die dritte Unterstützungsebene für die Plattform x86_64-unknown-none wurde implementiert. Die dritte Ebene umfasst grundlegende Unterstützung, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds und Überprüfung der Code-Buildbarkeit.

Darüber hinaus können wir die Veröffentlichung der Rust-Bibliotheken für Windows 0.30 durch Microsoft zur Kenntnis nehmen, die es Ihnen ermöglichen, die Rust-Sprache zum Entwickeln von Anwendungen für das Windows-Betriebssystem zu verwenden. Das Set enthält zwei Crate-Pakete (Windows und Windows-Sys), über die Sie in Rust-Programmen auf die Win-API zugreifen können. Code für die API-Unterstützung wird dynamisch aus Metadaten generiert, die die API beschreiben, sodass Sie nicht nur Unterstützung für bestehende Win-API-Aufrufe implementieren können, sondern auch für Aufrufe, die in der Zukunft erscheinen werden. Die neue Version bietet Unterstützung für die UWP-Zielplattform (Universal Windows Platform) und implementiert die Handle- und Debug-Typen.

Source: opennet.ru

Kommentar hinzufügen