rust / intermediate
Snippet
Unsafe Rust: Manuelle Zeigeroperationen
Unsafe-Blöcke in Rust ermöglichen fünf zusätzliche Fähigkeiten: Rohe Zeiger-Dereferenzierung, Aufruf von unsicheren Funktionen, Zugriff auf veränderliche statische Variablen, Implementierung von unsicheren Traits und Modifikation von rohen Arrays. Diese Operationen umgehen den Borrow-Checker und werden typischerweise für Low-Level-Operationen wie FFI, benutzerdefinierte Allocators oder Hardware-Interaktion verwendet. Obwohl mächtig, bleibt unsicherer Code isoliert—der Compiler gewährleistet weiterhin Speichersicherheit für sicheren Rust-Code, der mit unsicheren Blöcken interagiert.
snippet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
unsafe fn danger_zone() {let mut value = 42i32;let ptr = &mut value as *mut i32;println!("Original: {}", value);*ptr = 100;println!("Modified via pointer: {}", value);}unsafe fn raw_slice_access() {let arr = [1, 2, 3, 4, 5];let ptr = arr.as_ptr();let third = ptr.offset(2).read();println!("Third element: {}", third);}unsafe fn reinterprete_memory() {let num: u32 = 0x41424344; // ASCII: DCBAlet bytes: &[u8; 4] = unsafe { std::mem::transmute(&num) };println!("Bytes: {:02x} {:02x} {:02x} {:02x}",bytes[0], bytes[1], bytes[2], bytes[3]);}fn main() {unsafe {danger_zone();raw_slice_access();reinterprete_memory();}println!("Unsafe code completed successfully");}
Erklärung
1
*mut i32
Roher veränderlicher Zeigertyp, nicht vom Borrow-Checker verfolgt
2
ptr.offset(2)
Zeiger-Arithmetik für Zugriff auf drittes Element
3
.read()
Wert von Rohzeiger lesen ohne Borrow
4
std::mem::transmute
Bit-Level Typ-Neudeutung, benötigt unsafe
5
unsafe { }
Erforderlicher Wrapper für unsichere Operationen