capypad
0 Tage Serie
rust / intermediate
Snippet

Unsafe Rust: Rohe Pointer und FFI

Unsafe Rust ermöglicht fünf zusätzliche Fähigkeiten: Rohe Pointer-Dereferenzierung, Aufrufen von unsafe Funktionen, Zugriff auf mutable Statics, Implementieren von externen Traits und Zugriff auf mutable Referenzen in Inline-Assembly. Der unsafe Block teilt dem Compiler mit 'Ich verspreche, dass dies sicher ist.'

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
fn main() {
let mut values = [1, 2, 3, 4, 5];
let ptr = values.as_mut_ptr();
let len = values.len();
let capacity = values.capacity();
 
unsafe {
for i in 0..len {
*ptr.add(i) *= 2;
}
println!("Doubled via raw pointer: {:?}", values);
}
 
extern "C" {
fn abs(input: i32) -> i32;
}
 
let negative = -42;
let absolute = unsafe { abs(negative) };
println!("Absolute value of {}: {}", negative, absolute);
 
unsafe fn dangerous_operation() -> i32 {
println!("This function is unsafe!");
42
}
 
let result = unsafe { dangerous_operation() };
println!("Unsafe function result: {}", result);
}
Erklärung
1
values.as_mut_ptr()
Erhält rohen mutable Pointer; kein Lifetime-Tracking
2
*ptr.add(i) *= 2
Dereferenziert und modifiziert; erfordert unsafe Block
3
extern "C" { fn abs }
FFI-Deklaration; ruft C Standard-Bibliotheksfunktion auf
4
unsafe fn dangerous_operation()
Funktion als unsafe markiert; Aufrufer muss unsafe Block verwenden
5
unsafe { abs(...) }
Aufruf einer unsafe externen Funktion erfordert unsafe Block