关于 rust-unsafe-boundaries
面向 Rust 开发者的技能,指导将 unsafe 代码限制在小型、易测试且有文档说明的边界内,并强调不变量、安全契约和边界测试。
主要功能
- 01优先尝试安全 Rust 设计
- 02记录不变量与安全契约
- 03缩小 unsafe 代码块
- 04测试恐慌、边界和析构路径
- 05项目支持时使用 Miri
适用场景
- 01审查拟议的 unsafe Rust 代码
- 02通过安全 API 封装 unsafe 内部实现
- 03测试初始化与所有权边界情况
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill rust-unsafe-boundaries安装后在 Claude Code 中输入/rust-unsafe-boundaries确认已加载。
附带文件agents/openai.yamlreferences/safety-invariants.md
详细介绍
Rust 不安全边界
使用此技能,将不安全 Rust 隔离在小巧、有文档说明且可测试的边界内。只有当安全 API 无法以可接受的正确性和性能表达所需操作时,才可以使用不安全代码。
核心工作流
- 先尝试安全的设计。检查标准 API、所有权重构、迭代器、同步原语和现有 crate。
- 明确说明安全 Rust 无法证明的不变量。如果无法写清楚该不变量,暂时不要编写不安全代码。
- 将不安全代码块控制得尽可能小。在代码块之前用安全代码完成运行时检查和准备工作。
- 在每个不安全代码块的正前方添加
// SAFETY:注释,说明其中每项不安全操作为何有效。 - 只有当调用方必须满足额外条件时,才将函数标记为
unsafe fn。在# Safety部分中记录这些条件。 - 启用或遵守
unsafe_op_in_unsafe_fn;不安全函数中的不安全操作仍应包在显式的不安全代码块中。 - 测试正常行为、边界情况、panic 路径和销毁行为。项目支持时运行 Miri。
边界规则
添加或审核不安全代码前,请阅读 references/safety-invariants.md。
- 优先使用私有的不安全内部实现,并通过安全的公共包装器提供接口。
- 优先使用
MaybeUninit<T>,而不是已弃用或临时拼凑的未初始化内存模式。 - 除非已证明有效性、对齐、初始化、别名规则和生命周期均成立,否则绝不从原始指针创建引用。
- 除非已证明容量、初始化和所有权均成立,否则不要使用
set_len、指针运算或from_raw_parts。 - 涉及部分初始化的值、手动销毁或长度变更时,明确处理 panic 安全性。
- 避免使用
static mut;优先使用OnceLock、LazyLock、原子类型或加锁状态。
文档模式
/// # Safety
///
/// `ptr` must be non-null, aligned for `T`, initialized, and valid for reads
/// for the returned lifetime. No mutable reference may alias the same value.
pub unsafe fn read_ref<'a, T>(ptr: *const T) -> &'a T {
// SAFETY: The caller guarantees `ptr` satisfies the documented contract.
unsafe { &*ptr }
}
审核清单
- 每个不安全代码块都有就近的
SAFETY说明。 - 每个
unsafe fn或不安全 trait 都有# Safety契约。 - 公共安全 API 无法被用于破坏内部不变量。
- Drop、panic 和提前返回路径都能保留初始化状态和所有权。
- 测试或 Miri 覆盖危险边界,而不只是顺利执行的路径。
评论
支持 Markdown