Rust Unsafe 边界:别让检索上下文带着悬垂引用穿层
先把问题落到具体对象
在检索和上下文编排链路中,Unsafe 最容易被用来绕过生命周期、共享可变缓存或做零拷贝转换。每个 Unsafe 块都应说明不变量、调用方责任和失效条件。
实施范围如何收敛
不要把临时缓冲区强转成'static引用,也不要用裸指针绕过并发访问。需要零拷贝时,让所有者对象覆盖引用的完整生命周期;跨线程共享则由类型和同步原语表达,而不是靠注释保证。
审阅 Unsafe 的顺序
- 给每个 Unsafe 块写明引用的所有者、有效期、别名规则和调用方必须满足的条件。
- 检查检索缓冲区释放、缓存替换和跨线程传递时,引用是否可能继续存活。
- 用安全封装提供测试入口,再用 Miri 或属性测试覆盖越界、别名和释放顺序。
- 无法由类型或测试维持的不变量,回到拥有数据的对象设计,不用注释承诺安全。
交付前检查
确认每个 Unsafe 块都能单独审阅,并用 Miri、属性测试或目标平台测试覆盖别名、越界和释放顺序。
适用边界
Miri 能发现部分未定义行为,却不能证明跨 FFI 或目标平台的契约正确。这里的边界仍要由实际所有权关系和调用约定来说明。