Unsafe 不安全操作
在代码库中,应尽量减少不安全代码的使用。Rust 中的不安全注解用于绕过编译器设置的保护机制。
原始指针
原始指针 *
具有与引用 &T
类似的功能,但由于没有借用检查器,故不能保证它们有指向有效数据。
这也是为什么只能在 unsafe
不安全块内对原始指针解引用的原因。
fn main() {
let x = 42;
let raw_ptr: *const i32 = &x;
// 解引用原始指针
unsafe {
let value = *raw_ptr;
println!("Dereferenced value: {}", value);
}
}
如果不在 unsafe
块中执行此操作,将触发错误:
error[E0133]: dereference of raw pointer is unsafe and requires unsafe function or block
调用不安全函数
有些函数必须声明为 unsafe
才可调用,因为 Rust 与其他语言编写的代码(例如 C)交互,或者处理原始指针等操作被视为不安全。
在 Rust 中,调用不安全函数涉及将调用封装在不安全块中,以向编译器指示你对代码的正确性和安全性负责。
// 定义一个不安全函数
unsafe fn unsafe_function(value: i32) {
println!("Unsafe function called with value: {}", value);
}
fn main() {
// 在不安全块中调用不安全函数
unsafe {
unsafe_function(58);
}
}
内联汇编
Rust 通过 asm!
宏提供内联汇编支持。
use std::arch::asm;
fn main() {
let i: u64 = 3;
let o: u64;
unsafe {
asm!(
"mov {0}, {1}",
"add {0}, 5",
out(reg) o,
in(reg) i,
);
}
assert_eq!(o, 8);
}
了解有关 asm 操作数的更多信息,参见 Rust手册。
代码挑战
尝试修改代码以实现数字的交换。
Loading...
> 此处输出代码运行结果