Rust 1.53 veröffentlicht. Google wird das Hinzufügen von Rust-Unterstützung zum Linux-Kernel finanzieren

Die Veröffentlichung der vom Mozilla-Projekt gegründeten, mittlerweile aber unter der Schirmherrschaft der unabhängigen Non-Profit-Organisation Rust Foundation entwickelten Systemprogrammiersprache Rust 1.53 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:

  • Für Arrays wurde das IntoIterator-Merkmal implementiert, mit dem Sie die Iteration von Array-Elementen nach Werten organisieren können: for i in [1, 2, 3] { .. }

    Es ist auch möglich, Arrays an Methoden zu übergeben, die Iteratoren akzeptieren, zum Beispiel: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Bisher wurde IntoIterator nur für Array-Referenzen implementiert, d. h. Um über Werte zu iterieren, war die Verwendung von Referenzen („&[1, 2, 3]“) oder „[1, 2, 3].iter()“ erforderlich. Die Implementierung von IntoIterator für Arrays wurde durch Kompatibilitätsprobleme behindert, die durch eine frühere Compilerkonvertierung von array.into_iter() nach (&array).into_iter() verursacht wurden. Diese Probleme wurden mit einer Problemumgehung gelöst: Der Compiler konvertiert weiterhin array.into_iter() in (&array).into_iter(), als gäbe es keine Implementierung des IntoIterator-Merkmals, jedoch nur, wenn die Methode mit „.into_iter(“ aufgerufen wird. )“-Syntax und ohne die Aufrufe in der Form „in [1, 2, 3]“, „iter.zip([1, 2, 3])“, „IntoIterator::into_iter([1, 2, 3]“ zu berühren )".

  • Es ist möglich, Ausdrücke „|“ anzugeben. (logische ODER-Verknüpfung) in einem beliebigen Teil der Vorlage, beispielsweise anstelle von „Some(1) | Some(2)“ können Sie nun „Some(1 | 2)“ schreiben: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Die Verwendung von Nicht-ASCII-Zeichen in Bezeichnern ist zulässig, einschließlich aller in der Unicode UAX 31-Spezifikation definierten nationalen Zeichen, jedoch ausgenommen Emoji-Zeichen. Wenn Sie unterschiedliche, aber ähnliche Zeichen verwenden, gibt der Compiler eine Warnung aus. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: String, } let α = 1; letsos = 2; Warnung: Bezeichnerpaar zwischen „s“ und „s“ gilt als verwechselbar
  • Ein neuer Teil der APIs wurde in die stabile Kategorie übertragen, darunter die folgenden stabilisierten:
    • array::from_ref
    • array::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::retain
    • BTreeMap::retain
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Dauer::NULL
    • Dauer::MAX
    • Dauer::is_zero
    • Dauer::saturating_add
    • Dauer::saturating_sub
    • Dauer::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator für Arrays
    • {integer}::BITS
    • io::Error::Unsupported
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Option::einfügen
    • Bestellung::is_eq
    • Bestellung::is_ne
    • Bestellen::is_lt
    • Bestellung::is_gt
    • Bestellung::is_le
    • Bestellung::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowercase
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • Slice::IterMut::as_slice
    • AsRef<[T]> für Slice::IterMut
    • impl SliceIndex für (Bound , Gebunden )
    • Vec::extend_from_within
  • Die dritte Unterstützungsebene für die Plattform wasm64-unknown-unknown wurde implementiert. Die dritte Ebene umfasst grundlegende Unterstützung, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds oder Prüfung, ob der Code erstellt werden kann.
  • Der Cargo-Paketmanager wurde verschoben, um standardmäßig den Namen „main“ für den Hauptzweig des Git-Repositorys (HEAD) zu verwenden. Abhängigkeiten, die in Repositorys gehostet werden, die den Namen „main“ anstelle von „master“ verwenden, erfordern nicht mehr die Konfiguration von branch = „main“.
  • Im Compiler werden die Anforderungen für die Mindestversion von LLVM auf LLVM 10 angehoben.

Darüber hinaus können wir die Bereitstellung von Mitteln für die Entwicklung der Integration von Tools zur Entwicklung von Komponenten in der Rust-Sprache in den Linux-Kernel feststellen. Die Arbeiten werden im Rahmen des Prossimo-Projekts unter der Schirmherrschaft der ISRG-Organisation (Internet Security Research Group) durchgeführt, die Gründerin des Let's Encrypt-Projekts ist und HTTPS und die Entwicklung von Technologien zur Erhöhung der Sicherheit des Netzwerks fördert Internet. Die Mittel werden von Google bereitgestellt, das die Arbeit von Miguel Ojeda, dem Autor des Rust-for-Linux-Projekts, finanziert. Zuvor haben ISRG und Google bereits die Erstellung eines alternativen HTTP-Backends für das Curl-Dienstprogramm und die Entwicklung eines neuen TLS-Moduls für den Apache-HTTP-Server finanziert.

Laut Microsoft und Google werden etwa 70 % der Schwachstellen durch unsichere Speicherverarbeitung verursacht. Es wird erwartet, dass die Verwendung der Rust-Sprache zur Entwicklung von Kernelkomponenten wie Gerätetreibern das Risiko von Schwachstellen aufgrund unsicherer Speicherverarbeitung verringert und Fehler wie den Zugriff auf einen Speicherbereich nach dessen Freigabe und das Überlaufen von Puffergrenzen beseitigt.

Die speichersichere Handhabung wird in Rust zur Kompilierungszeit durch Referenzprüfung, Verfolgung des Objektbesitzes und der Objektlebensdauer (Umfang) sowie durch die Bewertung der Korrektheit des Speicherzugriffs während der Codeausführung gewährleistet. Rust bietet außerdem Schutz vor Ganzzahlüberläufen, erfordert eine obligatorische Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek besser, wendet standardmäßig das Konzept unveränderlicher Referenzen und Variablen an und bietet starke statische Typisierung, um logische Fehler zu minimieren.

Source: opennet.ru

Kommentar hinzufügen