Unsafe Rust
Unsafe Block Fähigkeiten
Abschnitt betitelt „Unsafe Block Fähigkeiten“Welche der folgenden sind „Superkräfte“, die Rust innerhalb eines unsafe -Blocks ermöglicht?
unsafe -Blöcke ermöglichen Ihnen die Dereferenzierung von Rohzeigern und den Aufruf von unsafe -Funktionen. Allerdings deaktiviert unsafe den Borrow Checker nicht (Operationen auf sicheren Referenzen werden weiterhin geprüft). Eine Referenz kann in normalem, sicherem Code in einen Rohzeiger umgewandelt werden.
Rohzeiger und Vec Kapazität
Abschnitt betitelt „Rohzeiger und Vec Kapazität“fn main() { let mut v = Vec::with_capacity(4); for i in 0 .. 3 { v.push(i); } let n = &v[0] as *const i32; v.push(4); println!("{}", unsafe { *n });}Dieses Programm ist gefährlich! Es kompiliert korrekt und wird ohne Probleme ausgeführt, weil Vec genügend Kapazität hat, sodass v.push(4) es nicht neu dimensioniert. Wenn die Kapazität jedoch 3 wäre, würde n auf freigegebenen Speicher zeigen.
Unsafe und Borrow Checker
Abschnitt betitelt „Unsafe und Borrow Checker“Welche der folgenden Situationen sind idiomatische Methoden, um den Borrow Checker mit unsafe -Code (oder einem sicheren Wrapper um unsafe -Code) zu umgehen?
Zwei mutable Referenzen auf disjunkte Indizes sind sinnvoll, da der Borrow Checker nicht versteht, wann Indizes disjunkt sind. Siehe: slice::split_at_mut (https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_at_mut).
Das Zulassen von nicht initialisierten Werten ist sinnvoll, da der Borrow Checker eine konservative Richtlinie verfolgt, dass Werte immer initialisiert sein müssen, es aber manchmal nützlich ist, mit nicht initialisierten Werten zu arbeiten. Siehe MaybeUninit (https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html) und die take_mut -Crate (https://docs.rs/take_mut/0.2.2/take_mut/index.html).
Eine Struktur, die eine Referenz auf sich selbst hält, ist sinnvoll, da der Borrow Checker die Lebensdauer von Selbstreferenzen nicht nachvollziehen kann. Siehe das std::pin -Modul (https://doc.rust-lang.org/stable/std/pin/index.html).
Die Rückgabe eines Zeigers auf eine stack-allozierte Variable ist jedoch niemals mit unsafe -Code gültig. Die einzig geeignete Umgehung ist die Verwendung von Garbage Collection, z.B. die Rückgabe eines Rc<T> anstelle von &T .