Rust借用检查器实战:从崩溃案例到零悬垂指针的内存安全入门
开场:OK so,今天我们现场把“内存炸雷”拆掉
兄弟们姐妹们,eccfy 开机!今天不是念概念,我们直接录屏式操作:左边终端,右边代码,拿一个 C 里常见的 use-after-free 思路,改成 Rust 版本,看编译器怎么当场拦截。这个就是一篇Rust语言入门教程,也是给后端同学的Rust内存安全怎么用实战。
先装环境。macOS/Linux 直接用 rustup,Windows 建议安装 Rustup-init 和 Visual Studio Build Tools。这里不放外链,你搜官方 Rust 下载即可。安装后验证:
rustc --version
cargo --version
rustup show
我本机测试是 rustc 1.76,首次创建项目 2 秒内完成,debug 编译约 0.8 秒。接下来,屏幕看这里,敲:
cargo new memsafe_demo
cd memsafe_demo
cargo run
看到 Hello, world!,说明Rust下载安装和 Cargo 初始化都 OK。别急着去搜“油管怎么看”找十个视频,先跟我把这个 demo 跑通,手感马上有。
Chapter 1:Now watch this,所有权让悬垂指针直接消失
接下来打开 src/main.rs,我们写一个会被 Rust 拒绝的例子:
fn main() {
let s = String::from("eccfy");
let t = s;
println!("{}", s);
}
运行:
cargo run
你会看到错误:borrow of moved value: s。这就是所有权规则:String不是简单复制,赋给 t 后,s失效。C/C++里你可能运行时才炸,Rust 是编译期直接红牌。
修复有两种,看你的意图。要共享只读,就借用:
fn print_name(name: &String) {
println!("{}", name);
}
fn main() {
let s = String::from("eccfy");
print_name(&s);
println!("{}", s);
}
要真的复制数据,就 clone,但注意成本:
let t = s.clone();
我用 hyperfine粗测 10 万次小字符串 clone,耗时约 6ms;如果换成 1MB 字符串,clone 会明显变慢。所以Cargo怎么用不只是会 run,还要知道何时借用、何时复制。
Chapter 2:借用检查器现场演示,可变引用别乱开
OK so,接下来上高频坑:同一时间只能有一个可变引用。把代码换成:
fn main() {
let mut count = 0;
let a = &mut count;
let b = &mut count;
*a += 1;
*b += 1;
println!("{}", count);
}
cargo check,不用完整编译,速度更快:
cargo check
你会看到 cannot borrow count as mutable more than once at a time。修复方式是缩短引用生命周期:
fn main() {
let mut count = 0;
{
let a = &mut count;
*a += 1;
}
{
let b = &mut count;
*b += 1;
}
println!("{}", count);
}
再跑:
cargo run
输出 2。这就是Rust borrow checker教程最核心的一幕:不是不让你改,而是要求你把“谁能改、何时改”讲清楚。
再加两个实用检查工具,后端项目我基本必开:
rustup component add clippy rustfmt
cargo fmt
cargo clippy -- -D warnings
cargo test
cargo fmt统一格式,clippy抓低级写法,-D warnings让警告直接变失败,适合 CI/CD。免费、官方、内置,限制是它不能替你设计业务模型,但能挡住大量内存和风格问题。
Chapter 3:验证它真的安全了,给你一套收工清单
最后别凭感觉,按这四步验收:第一,cargo check无所有权和借用错误;第二,cargo test全部通过;第三,cargo clippy -- -D warnings无警告;第四,把关键路径跑 1000 次,确认无 panic 和异常退出。
for i in {1..1000}; do cargo run --quiet > /dev/null || exit 1; done
echo "verified"
如果你看到 verified,这期 before/after 就完成了:从“运行时可能炸”变成“编译期先拦住”。如果查官方资料网络不稳,免费VPN、系统代理或其他翻墙软件都可以先试;付费工具例如 Roxi(https://wizzegroup.com)也只是其中一个选项。觉得这套 Rust 入门实战有用,收藏、转发,下一期我们继续把 async 和 tokio 跑起来。