Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

English Original

Rust 中的类型驱动正确性

讲师简介

  • Microsoft SCHIE(Silicon and Cloud Hardware Infrastructure Engineering,硅与云硬件基础设施工程)团队首席固件架构师
  • 行业资深专家,专长于安全、系统编程(固件、操作系统、虚拟机管理程序)、CPU 与 platform 架构以及 C++ 系统
  • 2017 年在 AWS EC2 开始使用 Rust 编程,从此爱上了这门语言

这是一本关于如何利用 Rust 类型系统,让整类 bug 在编译阶段就无法出现 的实用指南。虽然配套书籍 Rust 模式 讲解了相关机制(Traits、关联类型、Type-state),但本指南将展示如何将这些机制 应用 到真实世界领域——如硬件诊断、密码学、协议校验和嵌入式系统。

这里的每一个模式都遵循同一个原则:将运行时检查的不变量推动到类型系统中,从而让编译器强制执行它们。

如何使用本书

难度说明

符号级别受众
🟢入门熟悉所有权 + Traits
🟡中级熟悉泛型 + 关联类型
🔶高级准备学习 Type-state、Phantom Types 和 Session Types

学习进度指南

目标路径时间
快速概览第 1 章、第 13 章(速查卡)30 分钟
IPMI / BMC 开发者第 2、5、7、10、17 章2.5 小时
GPU / PCIe 开发者第 2、6、9、10、15 章2.5 小时
Redfish 实现者第 2、5、7、8、17、18 章3 小时
框架 / 架构师第 4、8、11、14、18 章2.5 小时
“构造即正确”新手按顺序阅读第 1 到 10 章,然后完成第 12 章练习4 小时
完整深潜按顺序阅读所有章节7 小时

目录注释

章节标题难度核心思想
1核心理念:为什么类型胜过测试🟢正确性的三个层次;作为编译器检查保证的类型
2类型化命令接口🟡关联类型将请求与响应绑定
3单次使用类型🟡移动语义作为密码学的线性类型
4能力令牌🟡零大小的授权证明令牌
5协议状态机🔶适用于 IPMI 会话 + PCIe LTSSM 的 Type-state
6量纲分析🟢Newtype 包装器防止单位混淆
7已验证边界🟡在边界处一次性解析,在类型中携带证明
8能力混入🟡组成式 Traits + Blanket 映射
9Phantom Types🟡用于寄存器宽度、DMA 方向的 PhantomData
10综合应用🟡在一个诊断平台中组合全部 7 类模式
11一线实践中的十四个技巧🟡哨兵值转 Option、Sealed Traits、Builders 等
12练习🟡带解决方案的六个综合问题
13速查卡-模式目录 + 决策流程图
14测试类型层保证🟡trybuild, proptest, cargo-show-asm
15const fn🔶内存映射、寄存器、位字段的编译期证明
16SendSync🔶编译期并发正确性证明
17Redfish 客户端实战讲解🟡将八种模式组合成类型安全的 Redfish 客户端
18Redfish 服务器实战讲解🟡Builder Type-state、源令牌、健康汇总、混入

前置要求

概念学习位置
所有权与借用Rust 模式,第 1 章
Traits 与关联类型Rust 模式,第 2 章
Newtypes 与 Type-stateRust 模式,第 3 章
PhantomDataRust 模式,第 4 章
泛型与 Trait 约束Rust 模式,第 1 章

“构造即正确”光谱

较低安全性                                                    较高安全性

运行时检查          单元测试          属性测试          构造即正确
----------------    ----------        --------------      -----------------------

if temp > 100 {     #[test]           proptest! {         struct Celsius(f64);
  panic!("too       fn test_temp() {    |t in 0..200| {   // 不能在类型层面上
  hot");              assert!(          assert!(...)       // 与 Rpm 混淆
}                     check(42));     }
                    }                 }

无效程序?          无效程序?        无效程序?          无效程序?
在生产中崩溃。      在 CI 中失败。    在 CI 中失败        无法编译。
                                      (概率性的)。        根本不存在。

本指南工作在最右侧的位置——在那里, bug 不存在,因为类型系统 无法表达它们