用真实运行验证裸指针:创建与比较安全、解引用 unsafe;悬空指针只是地址;add 以元素为单位、byte_add 以字节为单位;两个 &mut 报 E0499 而两个 *mut 可以并存;Box::into_raw / from_raw 与泄漏;用裸指针实现带正确 Drop 的双向链表。
用真实 libc 与自己用 clang 编译的静态库验证 FFI:strlen / abs / getpid 与 CString;把 Rust 回调交给 qsort(17 次回调);repr(C) 结构体按值与按指针传递;C 往 Rust 缓冲区写数据;extern 声明写错时 rustc 不报错而运行得到垃圾或段错误。
用 --emit 与 -Z time-passes 看 rustc 的编译阶段:各种产物的大小(llvm-ir 380,024 字节对 mir 10,174 字节);43 个计时条目按序就是 parse → 宏展开 → 名字解析 → 类型检查 → 借用检查 → 单态化收集 → LLVM IR → LLVM passes → 链接;debug 与 release 的差别集中在 LLVM_passes(0.02 s 对 0.068 s)。
用 --emit=mir 看真实的 MIR:带分支函数的 6 个基本块与 switchInt;溢出检查是 MIR 里的 MulWithOverflow + assert;String 的 drop 与 panic 时的 cleanup 块;mir-opt-level 0 → 2 把函数从 42 行折叠成 _0 = const 20(16 行);借用错误的三个位置。
用 --emit=llvm-ir 对比 O0 与 O3:sum 函数从 40 行(alloca 3、无向量)变成 89 行(14 个 phi、21 处 <4 x i32> 向量);O0 的 into_iter/next 是真实调用;caller 的 call 从 4 条到 0 条(内联);各 opt-level 汇编指令数 146/17/71/71/17/15。
用 -Z print-mono-items 与汇编验证单态化生成的代码:largest<T> 得到 i32/f64/u8/char 4 个实例;f64 是 fcmp+fcsel、i32 是 cmp+csel gt、u32 是 csel hi;相同指令的 add_pair<u32> 与 add_pair<i32> 被合并成别名;泛型与 &dyn 版本 16 个类型的目标文件 11,488 对 11,208 字节。
用 cargo 的 dev 与 release 构建同一个程序验证差异:速度 4.7/21.1/33.9 倍(collatz/HashMap/排序);只把 dev 的 opt-level 调到 3 就追平 release;release 加 overflow-checks 让 collatz 从 35.8 变 46.7 ms,加 debug-assertions 让排序从 14.1 变 31.9 ms;溢出在 dev panic、release 回绕。
下载 rayon 做一个真实依赖的程序,逐项改 release profile 全量重编:strip -24%、thin LTO -2%、fat LTO -16%、panic = abort -9%;opt-level s/z 反而更大;全套配置只剩默认体积的 57%(336,752 字节)。
用 5000 个函数的 crate 验证增量编译:dev 里改一个函数体 0.77 s 对关闭增量 2.48 s;代价是首次稍慢(3.05 对 2.55 s)和 132.9 MB 的增量目录;release 默认不开增量,改一处 3.32 s,强制开启后 0.77 s。
用 nm、otool、管道与计时验证 Rust 二进制的启动:真正入口是 C 风格 main → std::rt::lang_start → 你的 main;lang_start 把 SIGPIPE 设成忽略(写关闭的管道得 BrokenPipe,C 被信号杀死返回 141);std 的启动比 C 空 main 多约 238 µs;main 返回 ExitCode 照常析构而 process::exit 不析构。
用真实文件系统验证 std::fs:一行读写与 UTF-8 要求;NotFound(2)/PermissionDenied(13)/AlreadyExists/IsADirectory(21) 的错误;OpenOptions 的覆盖/截断/追加;tmp + rename 原子替换 300 次读者撕裂 0 次而直接覆盖读到不完整内容 8 次;read_dir 顺序不保证。
用计数的 Read 包装器与真实文件验证 BufReader:逐字节读 10 万字节,无缓冲 100001 次 read 对 BufReader 8192 容量 14 次;调用数约等于文件大小/容量;20 MB 文件几种读法 9.6/19.3/34.2 ms;一次读完整个文件时 BufReader 没有收益。