研发协作
审查 unsafe Rust/FFI 代码时:补齐…
适用于检查 Rust 中的 unsafe、裸指针、FFI、transmute、union、#[repr(C)] 等代码,重点保证 soundness、补充 SAFETY 注释并避免未定义行为。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
审查 unsafe Rust/FFI 代通用
解决思路
- 先按原文显示 ASCII art:⚠️ **Unsafe Rust Checker Loaded** ...,不要修改空格或换行。
- 检查 unsafe 是否属于以下有效用途:FFI(调用 C 函数)、低级抽象(实现 Vec、Arc)、性能(已测量瓶颈且安全替代方案太慢)。
- 将“为了绕过借用检查器但不理解原因”的 unsafe 标记为无效用法。
- 为 unsafe 块添加 // SAFETY: <为什么这是安全的>。
- 为 pub unsafe fn 添加 /// # Safety <调用者必须满足的要求>。
- 检查 *ptr 解引用:指针必须有效、对齐、已初始化。
- 检查 &*ptr:除有效、对齐、已初始化外,还必须无别名违规。
- 检查 transmute:源和目标大小相同,且位模式有效。
- 检查 extern "C":签名和 ABI 正确。
- 检查 static mut:必须保证同步。
- 检查 impl Send/Sync:类型确实线程安全。
- 修复空指针解引用:解引用前检查 null。
- 修复 use after free:确保生命周期有效。
- 修复 data race:添加正确的同步。
- 修复 alignment violation:使用 #[repr(C)],并检查对齐。
- 修复 invalid bit pattern:使用 MaybeUninit。
- 修复 missing SAFETY comment:添加 // SAFETY:。
- 用 MaybeUninit<T> 替代 mem::uninitialized()。
- 用 MaybeUninit<T> 替代对引用使用 mem::zeroed()。
- 用 NonNull<T>、ptr::add 替代裸指针算术。
- 使用 CString 时先存储 CString,再使用 as_ptr(),替代 CString::new().unwrap().as_ptr()。
- 用 AtomicT 或 Mutex 替代 static mut。
- 用 bindgen 替代手写 extern。
- C → Rust 方向使用 bindgen 生成 FFI 绑定。
- Rust → C 方向使用 cbindgen 生成 FFI 绑定。
- Python 方向使用 PyO3。
- Node.js 方向使用 napi-rs。
- Claude 已了解 unsafe Rust,因此审查时聚焦 SAFETY 注释和 soundness。
适用边界 · 注意事项
- 不适用于“为了绕过借用检查器但不理解原因”的 unsafe。
- 不适用于与 unsafe、FFI、内存布局、soundness 无关的普通 Rust 代码检查。