Day 3:unsafe Rust 基礎
學習目標
- 認識 unsafe 的 5 個權限
- 解引用裸指標
- 理解為何要小心 unsafe
今日重點
unsafe 允許的 5 件事
- 解引用裸指標(raw pointer)
- 呼叫 unsafe 函式(如 FFI)
- 存取/修改可變靜態變數
- 實作 unsafe trait
- 存取 union 欄位
裸指標(raw pointer)
fn main() {
let mut num = 5;
let r1 = &num as *const i32; // 不可變裸指標
let r2 = &mut num as *mut i32; // 可變裸指標
unsafe {
println!("r1: {}", *r1);
println!("r2: {}", *r2);
*r2 = 10;
println!("r2: {}", *r2);
}
}
裸指標の規則:可能為空、無自動釋放、無借用檢查,必須在
unsafeblock 內解引用。
為什麼 unsafe 存在?
有些事(如與 C 溝通、效能極端優化)普通 Rust 做不到。unsafe 是「交給負責任的開發者」的逃逸門。若大量使用,system 安全保證就弱了些。
練習
// 1. 讀懂上面的裸指標範例
// 2. 宣告一個 static mut,在 unsafe 中修改
static mut COUNTER: i32 = 0; // 會警告 mutable static
fn main() {
unsafe {
COUNTER += 1;
println!("{}", COUNTER);
}
}
自我檢查
- 能背出 unsafe 的 5 個權限
- 會解引用裸指標
- 知道 static mut 的危險性
- 理解 unsafe 的取捨與責任
深入連結
- The Book 第 19 章「Unsafe Rust」+ Rustonomicon