capypad
0 Tage Serie
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
rust
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: DCBA
let 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