Day 3:unsafe Rust 基礎

學習目標

  • 認識 unsafe 的 5 個權限
  • 解引用裸指標
  • 理解為何要小心 unsafe

今日重點

unsafe 允許的 5 件事

  1. 解引用裸指標(raw pointer)
  2. 呼叫 unsafe 函式(如 FFI)
  3. 存取/修改可變靜態變數
  4. 實作 unsafe trait
  5. 存取 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);
    }
}

裸指標の規則:可能為空、無自動釋放、無借用檢查,必須在 unsafe block 內解引用。

為什麼 unsafe 存在?

有些事(如與 C 溝通、效能極端優化)普通 Rust 做不到。unsafe 是「交給負責任的開發者」的逃逸門。若大量使用,system 安全保證就弱了些。

練習

// 1. 讀懂上面的裸指標範例
// 2. 宣告一個 static mut,在 unsafe 中修改
static mut COUNTER: i32 = 0;   // 會警告 mutable static

fn main() {
    unsafe {
        COUNTER += 1;
        println!("{}", COUNTER);
    }
}
思考:為什麼 Rust 不允許直接改 static mut?(資料競爭)

自我檢查

  • 能背出 unsafe 的 5 個權限
  • 會解引用裸指標
  • 知道 static mut 的危險性
  • 理解 unsafe 的取捨與責任

深入連結

  • The Book 第 19 章「Unsafe Rust」+ Rustonomicon