Rust代码示例——22.不安全的操作
Rust的unsafe机制允许突破编译器安全检查,但需开发者自行确保代码安全。官方强调应尽量少用unsafe代码,主要应用于四种场景:解引用原始指针、调用不安全函数、操作可变静态变量及实现不安全trait。例如,std::slice::from_raw_parts要求指针必须有效且类型正确。使用unsafe时,安全责任从编译器转移给开发者,因此必须为unsafe代码提供明确文档,并保持代码块尽可能
后面这句话来自官方文档,“在代码中使用尽量最少使用不安全的代码”。时刻铭记在心这句话,然后就可以开始了!在Rust中使用不安全声明会在编译时对这段代码绕过保护。具体来说,不安全声明主要用于下面四种情况:
- 解引用原始指针
- 调用不安全的方法或函数(见前面章节中通过FFI调用函数)
- 访问或修改静态可变的变量
- 实现不安全接口
原始指针*和&T函数的引用类似,但是引用由于借用检查总可以保证其安全性,他总是指向有效的数据。解引用一个原始指针只能在一个不安全块中完成。
fn main() {
let raw_p: *const u32 = &10;
unsafe {
assert!(*raw_p == 10);
}
}
调用不安全的函数
函数可以被声明为不安全的(unsafe),这意味着有程序员来保证其安全性而不是由编译器来保证其安全性。下面的示例展示了std::slice::from_raw_parts的用法,它会根据第一个元素的指针和设定的长度创建一个切片并返回。
use std::slice;
fn main() {
let some_vector = vec![1, 2, 3, 4];
let pointer = some_vector.as_ptr();
let length = some_vector.len();
unsafe {
let my_slice: &[u32] = slice::from_raw_parts(pointer, length);
assert_eq!(some_vector.as_slice(), my_slice);
}
}
对于std::slice::from_raw_parts来说,假定条件之一是传递进来的指针必须指向有效的内存,并且指向的数据类型必须正确。如果这些条件不能被满足,则程序的行为将是不确定的,无人知晓会发生什么。
内容解析
Rust的不安全机制是其安全保证的一部分,它允许你在需要时突破编译器的安全检查,但要求开发者自行确保代码的安全性。
重要原则
尽量少使用不安全的代码:这是Rust官方文档强调的核心原则
责任转移:使用unsafe时,安全责任从编译器转移到开发者
前置条件:如from_raw_parts要求指针必须指向有效内存且类型正确
为什么需要不安全代码
不安全代码不是为了绕过Rust的限制,而是为了:
- 实现编译器无法验证的安全操作
- 与底层系统或外部代码交互
- 在某些情况下获取性能优势
注意:unsafe代码块应该尽量小,并且腰围其安全性提供明确的文档说明。
原文链接地址:https://doc.rust-lang.org/rust-by-example/unsafe.html
更多推荐



所有评论(0)