不安全操作
为了介绍本章内容,我们借用官方文档的一句话, “在基本代码中尽可能减少不安全的代码”(”one should try to minimize the amount of unsafe code in a code base.”)。记住这句话,接着我们进入学习!在 Rust 中,不安全代码块是用于避开编译器的保护策略;具体地说,不安全代码块主要有 4 方面内容:
- 解引用裸指针
- 通过 FFI 调用函数(这个内容在本书其他章节介绍过了)
- 使用
std::mem::transmute
来强制转型(change type) - 内联汇编(inline assembly)
原始指针
原始指针(裸指针) *
和引用 &T
有类似的功能,但引用总是安全的,因为它们保证指向一个有效的数据,这得益于借用检查器(borrow checker)。解引用一个裸指针只能通过不安全代码块中来完成。
fn main() { let raw_p: *const u32 = &10; unsafe { assert!(*raw_p == 10); } }
Transmute(转变)
从一种类型变到另一种类型的允许简单转换,但是两种类型必须拥有相同的大小和排列:
fn main() { let u: &[u8] = &[49, 50, 51]; unsafe { assert!(u == std::mem::transmute::<&str, &[u8]>("123")); } }