Z
ZHANK
进阶技巧

unsafe Rust 简介

unsafe 块/函数、解引用原始指针、调用 FFI、实现 unsafe trait

unsafe Rust 简介

Rust 的"安全"是默认的——unsafe 让你暂时跳出安全检查,做"我知道我在做什么"的事。FFI、裸指针、内联汇编都需要 unsafe。

学完本章你将: 掌握 unsafe 块/函数、解引用原始指针、FFI 调用。


unsafe 能做什么

rust
fn main() {
    // unsafe 块——你在告诉编译器:"我来保证安全"
    unsafe {
        // 1. 解引用裸指针
        let mut num = 5;
        let r1 = &num as *const i32;  // 裸指针
        let r2 = &mut num as *mut i32;
        *r2 = 10;
        println!("{}", *r1);  // 10

        // 2. 调用 unsafe 函数
        dangerous();
    }
}

unsafe fn dangerous() {
    // 这个函数只能在 unsafe 块中调用
}

调用 C 代码(FFI)

rust
// 声明外部函数
extern "C" {
    fn abs(input: i32) -> i32;
}

fn main() {
    unsafe {
        println!("|-3| = {}", abs(-3));
    }
}

// 也可以导出 Rust 函数给 C 调用
#[no_mangle]
pub extern "C" fn call_from_c() {
    println!("从 C 调用 Rust!");
}

unsafe 的黄金法则

rust
// ✅ unsafe 应该尽量小——只包裹真正不安全的操作
// ✅ 在 unsafe 外提供安全接口
// ✅ 用 // SAFETY: 注释解释为什么是安全的

// ❌ 不要把所有代码都放进 unsafe
// ❌ 不要裸用 unsafe 而不封装