Die Veröffentlichung der Programmiersprache Rust 1.93, die ursprünglich von Mozilla entwickelt wurde und inzwischen von der unabhängigen Non-Profit-Organisation Rust Foundation weitergeführt wird, wurde bekanntgegeben. Die Sprache konzentriert sich auf die sichere Verarbeitung von Speicher und bietet Mittel zur Erreichung hoher Parallelität bei der Ausführung von Aufgaben, ohne dabei auf einen Garbage Collector und ein Runtime-System angewiesen zu sein; das Runtime-System beschränkt sich auf die grundlegende Initialisierung und die Unterstützung der Standardbibliothek.
Die Speicherverwaltungsmethoden in Rust befreien Entwickler von Fehlern beim Umgang mit Zeigern und schützen vor Problemen, die durch die Programmierung auf niedriger Ebene entstehen, wie z.B. den Zugriff auf freigegebenen Speicher, Dereferenzierung von Nullzeigern, Pufferüberläufe usw. Zur Verteilung von Bibliotheken, zur Gewährleistung des Builds und zum Management von Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für die Bereitstellung von Bibliotheken wird das Repository crates.io unterstützt.
Die sichere Handhabung von Speicher in Rust wird während der Kompilierung durch die Überprüfung von Referenzen, das Verfolgen des Besitztums von Objekten, das Management der Lebensdauer von Objekten (Sichtbarkeitsbereiche) und die Bewertung der Korrektheit des Zugriffs auf den Speicher zur Laufzeit sichergestellt. Rust bietet außerdem Mechanismen zum Schutz vor ganzzahligen Überläufen, erfordert die verpflichtende Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek effektiver, implementiert das Konzept der Unveränderlichkeit (immutable) von Referenzen und Variablen standardmäßig und bietet eine starke statische Typisierung zur Minimierung logischer Fehler.
Hauptneuheiten:
- Die in Rust standardmäßig integrierte C-Bibliothek Musl, die bei der statischen Verlinkung für die Zielplattformen "*-linux-musl" (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl usw.) auf Systemen ohne Musl verwendet wird, wurde auf Version 1.2.5 aktualisiert. Die minimal unterstützte Version von Musl bei der dynamischen Verlinkung wurde ebenfalls auf die Ausgabe 1.2.5 angehoben. Zuvor kam in Rust die Version Musl 1.2.3 zum Einsatz, die Probleme mit der Implementierung des DNS-Resolvers hatte. In der Version Musl 1.2.4 wurde dem DNS-Resolver die Möglichkeit hinzugefügt, Anfragen über TCP zu senden, falls die UDP-Anfrage fehlschlug, was das Problem mit großen DNS-Einträgen löste und die Kompatibilität mit rekursiven DNS-Servern verbesserte, die keine Teilergebnisse in abgeschnittenen UDP-Antworten unterstützen. In der Version Musl 1.2.5 wurde im DNS-Resolver die Verarbeitung von Antworten mit langen CNAME-Folgen implementiert und das Problem behoben, bei dem einige große Antworten, die über TCP übertragen wurden, verworfen wurden.
- Die Standardbibliothek wurde überarbeitet, um Probleme mit der Reentranz zu lösen, die bei der Verwendung in globalen Speicherallokatoren, die in Rust geschrieben sind, durch das Makro std::thread_local! und die Funktion std::thread::current entstanden sind und zu unendlicher Rekursion führten. Um zu verhindern, dass std::thread_local! und std::thread::current beim Versuch, Speicher zuzuweisen, denselben Allokator aufrufen, in dem sie verwendet werden, wird nun direkt der systemeigene Speicherzuweisungsmechanismus angewendet.
- Innerhalb der «asm!» Blöcke ist die Verwendung von «cfg»-Attributen erlaubt, was es beispielsweise ermöglicht, die Aktivierung erweiterter CPU-Befehlsätze im Kontext einzelner Ausdrücke innerhalb des asm-Blocks zu steuern (zuvor konnten «cfg»-Attribute nur für den gesamten asm-Block festgelegt werden). asm!( // oder global_asm! oder naked_asm! «nop», #[cfg(target_feature = «sse2»)] «nop», // … #[cfg(target_feature = «sse2»)] a = const 123, // nur verwendet bei sse2 );
- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von Traits:
- <[MaybeUninit]>::assume_init_drop
- <[MaybeUninit]>::assume_init_ref
- <[MaybeUninit]>::assume_init_mut
- <[MaybeUninit]>::write_copy_of_slice
- <[MaybeUninit]>::write_clone_of_slice
- String::into_raw_parts
- Vec::into_raw_parts
- ::unchecked_neg
- ::unchecked_shl
- ::unchecked_shr
- ::unchecked_shl
- ::unchecked_shr
- ::as_array
- ::as_array_mut
- ::as_array
- ::as_mut_array
- VecDeque::pop_front_if
- VecDeque::pop_back_if
- Duration::from_nanos_u128
- char::MAX_LEN_UTF8
- char::MAX_LEN_UTF16
- std::fmt::from_fn
- std::fmt::FromFn
- Die Zielplattform «riscv64a23-unknown-linux-gnu» wurde auf die zweite Unterstützungsstufe umgestellt, die eine Garantie für den Build, jedoch keine Garantien bei der Durchführung des Test-Sets impliziert.
Zusätzlich können mehrere mit Rust verbundene Projekte erwähnt werden:
- Für den Linux-Kernel wird das Framework Rex entwickelt, mit dem Erweiterungen für den Linux-Kernel in Rust erstellt werden können, die zur Erweiterung der Kernel-Funktionalität anstelle von eBPF verwendet werden können. Rex bietet die gleichen Sicherheitsgarantien wie eBPF, nutzt jedoch die Möglichkeiten von Rust für Isolation und Sicherheit sowie ein leichtgewichtiges Runtime. Bei solchen Programmen wird kein Verifier verwendet, und die Programme werden mit dem Rust-Compiler in nativen Code kompiliert.
In Rex-Programmen darf eine Teilmenge der Programmiersprache Rust verwendet werden, die Sicherheitsgarantien bietet. Derzeit werden 5 Typen von eBPF-Programmen unterstützt: kprobe, perf_event, tracepoint, xdp und tc. Es besteht die Möglichkeit, eBPF-Hilfsfunktionen aufzurufen, mit eBPF-Map-Strukturen zu interagieren, Ressourcen des Kernels zu verwalten, Ausnahmen zu behandeln und Bindings sowie Abstraktionen über Kernelstrukturen zu verwenden.
- Die Veröffentlichung von Fjall 3 steht zur Verfügung, ein in Rust geschriebenes eingebettetes Speichersystem, das mit Daten im Schlüssel-Wert-Format arbeitet. Die Datenspeicherung erfolgt in Form eines Logs unter Verwendung eines LSM-Baums (Log-Structured Merge), wie bei RocksDB, wobei Änderungen durch das Hinzufügen von Daten an das Ende der Datei protokolliert werden. Für den Zugriff auf die Datenbank wird eine API im Stil von BTreeMap angeboten. Unterstützt werden Möglichkeiten wie Namensräume, Vorwärts- und Rückwärtssuche nach Bereichen, integrierte Kompression, serialisierbare Transaktionen, getrennte Speicherung von Schlüsseln und zugehörigen sehr großen Werten sowie automatisierte Hintergrundmaintenance der Datenbank. Der Code ist unter der Apache 2.0-Lizenz offen.
- Das Tor-Projekt hat die Version Arti 1.9.0 veröffentlicht, eine Implementierung des Tor-Frameworks, die in Rust geschrieben wurde. Wenn der Arti-Code das Niveau erreicht, das in der Lage ist, die C-Version vollständig zu ersetzen, beabsichtigen die Tor-Entwickler, Arti zum Hauptimplementierungsstandard für Tor zu machen und schrittweise die Unterstützung für die C-Implementierung einzustellen. In der neuen Version wird die Funktionalität für Relays und Server Directory Authorities (Verzeichnisbehörden) fortgesetzt, die Unterstützung für dynamisch zugewiesene Ports (proxy.socks_listen = „auto“) verbessert und eine experimentelle API zur Verwaltung von Schlüsseln für Onion-Dienste hinzugefügt.
Quelle: opennet.ru
