Die Veröffentlichung von Rust 1.91, einer Programmiersprache, die ursprünglich von Mozilla entwickelt wurde und nun unter der Schirmherrschaft der unabhängigen, gemeinnützigen Organisation Rust Foundation weitergeführt wird, ist erfolgt. Die Sprache konzentriert sich auf sichere Speichernutzung und bietet Mittel zur Erreichung einer hohen Ausführungsparallelität, ganz ohne Verwendung eines Garbage Collectors und Runtime (Runtime besteht aus grundlegender Initialisierung und der Unterstützung der Standardbibliothek).
Die Methoden zur Speicherverwaltung in Rust befreien den Entwickler von Fehlern beim Umgang mit Zeigern und schützen vor Problemen, die durch niedrige Speicherverwaltung entstehen, wie z. B. den Zugriff auf Speicherbereiche nach deren Freigabe, Dereferenzierung von Nullzeigern, Pufferüberläufen usw. Zur Verbreitung von Bibliotheken, zur Gewährleistung des Builds und zur Verwaltung von Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für das Hosting von Bibliotheken wird das Repository crates.io unterstützt.
Sichere Speicherverwaltung wird in Rust während der Kompilierung durch Überprüfung von Referenzen, Nachverfolgung des Eigentums an Objekten, Berücksichtigung der Lebensdauer von Objekten (Sichtbarkeitsbereiche) und Bewertung der Korrektheit des Zugriffs auf den Speicher während der Ausführung des Codes gewährleistet. Rust bietet ebenfalls Mittel zum Schutz vor Überläufen bei Ganzzahlen, fordert die zwingende Initialisierung von Variablenwerten vor deren Verwendung und behandelt Fehler in der Standardbibliothek besser. Außerdem wird das Konzept der Unveränderlichkeit (immutable) von Referenzen und Variablen standardmäßig angewendet, und es bietet eine starke statische Typisierung zur Minimierung logischer Fehler.
Hauptneuheiten:
- Die Unterstützung für 64-Bit-ARM-Systeme mit Windows OS wurde verbessert. Die Zielplattform "aarch64-pc-windows-msvc" wurde von der zweiten auf die erste Unterstützungsstufe angehoben. Für die Architekturen aarch64-pc-windows-gnullvm und x86_64-pc-windows-gnullvm wurde die zweite Unterstützungsstufe sichergestellt. Die erste Unterstützungsstufe umfasst die Erstellung von Binärpaketen, umfassende Tests und bietet die höchste Garantiesicherheit für die Plattform – jede Änderung im Compiler wird durch die Ausführung eines vollständigen Testsatzes überprüft. Die zweite Unterstützungsstufe umfasst die Erstellung von Binärpaketen und die Zusicherung des Builds, garantiert jedoch nicht die Bestehen des Testsatzes. Die dritte Stufe umfasst die grundlegende Unterstützung, jedoch ohne automatisiertes Testen, Veröffentlichung offizieller Builds und Überprüfung der Möglichkeit, den Code zu bauen.
- Eine Lint-Warnung "dangling_pointers_from_locals" wurde hinzugefügt, um Funktionen zu identifizieren, die hängende raw-Pointer (dangling raw pointer) zurückgeben, die auf Daten verweisen, die in lokalen Variablen gespeichert sind, die in der aufgerufenen Funktion definiert sind. Solche Variablen werden nach Abschluss der Funktion gelöscht, und die raw-Pointer auf die damit verbundenen Daten werden hängend, d. h. sie verweisen auf freigegebenen Speicher. Das anschließende Dereferenzieren eines solchen Zeigers führt zu undefiniertem Verhalten. fn f() -> *const u8 { let x = 0; &x \/\/ Warnung: Ein hängender Zeiger wird erzeugt, da die lokale Variable "x" gelöscht wird }
- Die Lint-Warnung "integer_to_ptr_transmutes" wurde hinzugefügt, die über die Umwandlung von Ganzzahlen in Pointer mittels der Funktion std::mem::transmute informiert.
- Im Paketmanager Cargo wurde die Unterstützung des Parameters "build.build-dir" stabilisiert, welcher das Verzeichnis zur Speicherung temporärer Build-Artefakte definiert, die von cargo und rustc während des Build-Vorgangs erstellt werden.
- Für ABI sysv64, win64, efiapi und aapcs wurde die Unterstützung für die Deklaration von Funktionen mit variabler Argumentenzahl im C-Stil stabilisiert.
- Die Unterstützung für Inline-Assembler für die Architektur LoongArch32 wurde stabilisiert.
- Eine neue Charge von APIs wurde in den stabilen Bereich überführt, darunter wurden Methoden und Implementierungen von Traits stabilisiert:
- Path::file_prefix
- AtomicPtr::fetch_ptr_add
- AtomicPtr::fetch_ptr_sub
- AtomicPtr::fetch_byte_add
- AtomicPtr::fetch_byte_sub
- AtomicPtr::fetch_or
- AtomicPtr::fetch_and
- AtomicPtr::fetch_xor
- {integer}::strict_add
- {integer}::strict_sub
- {integer}::strict_mul
- {integer}::strict_div
- {integer}::strict_div_euclid
- {integer}::strict_rem
- {integer}::strict_rem_euclid
- {integer}::strict_neg
- {integer}::strict_shl
- {integer}::strict_shr
- {integer}::strict_pow
- i{N}::strict_add_unsigned
- i{N}::strict_sub_unsigned
- i{N}::strict_abs
- u{N}::strict_add_signed
- u{N}::strict_sub_signed
- PanicHookInfo::payload_as_str
- core::iter::chain
- u{N}::checked_signed_diff
- core::array::repeat
- PathBuf::add_extension
- PathBuf::with_added_extension
- Duration::from_mins
- Duration::from_hours
- impl PartialEq für PathBuf
- impl PartialEq für PathBuf
- impl PartialEq für Path
- impl PartialEq für Path
- impl PartialEq für String
- impl PartialEq für String
- impl PartialEq für str
- impl PartialEq für str
- Ipv4Addr::from_octets
- Ipv6Addr::from_octets
- Ipv6Addr::from_segments
- impl Default für Pin<Box> wo Box: Default, T: ?Sized
- impl Default für Pin<Rc> wo Rc: Default, T: ?Sized
- impl Default für Pin<Arc> wo Arc: Default, T: ?Sized
- Cell::as_array_of_cells
- u{N}::carrying_add
- u{N}::borrowing_sub
- u{N}::carrying_mul
- u{N}::carrying_mul_add
- BTreeMap::extract_if
- BTreeSet::extract_if
- impl Debug für windows::ffi::EncodeWide
- str::ceil_char_boundary
- str::floor_char_boundary
- impl Sum für Saturating
- impl Sum für Saturating
- impl Product für Saturating
- impl Product für Saturating
- Das Merkmal «const» wird in Funktionen angewendet:
- ::each_ref
- ::each_mut
- OsString::new
- PathBuf::new
- TypeId::of
- ptr::with_exposed_provenance
- ptr::with_exposed_provenance_mut
- Der Compiler wurde auf die LLVM 21-Serie aktualisiert.
Quelle: opennet.ru
