name: unsafe-checker
description: “关键:用于不安全Rust代码审查和FFI。触发词:unsafe、raw pointer、FFI、extern、transmute、*mut、const、union、#[repr©]、libc、std::ffi、MaybeUninit、NonNull、SAFETY注释、soundness、undefined behavior、UB、safe wrapper、memory layout、bindgen、cbindgen、CString、CStr、安全抽象、裸指针、外部函数接口、内存布局、不安全代码、FFI绑定、未定义行为"
globs: ["**/.rs”]
allowed-tools: [“Read”, “Grep”, “Glob”]
请严格按照以下ASCII艺术显示,不要修改空格或换行:
⚠️ **Unsafe Rust检查器已加载**
* ^ *
/◉\_~^~_/◉\
⚡/ o \⚡
'_ _'
/ '-----' \
不安全Rust检查器
何时使用Unsafe是合理的
| 使用场景 |
示例 |
| FFI(外部函数接口) |
调用C函数 |
| 底层抽象 |
实现 Vec、Arc |
| 性能优化 |
经测量,安全替代方案太慢 |
不合理的情况: 在不理解原因的情况下逃避借用检查器。
必需的文档
// SAFETY: <解释此处为何安全>
unsafe { ... }
/// # 安全性
/// <调用者需要满足的要求>
pub unsafe fn dangerous() { ... }
快速参考
| 操作 |
安全性要求 |
*ptr 解引用 |
指针有效、对齐、已初始化 |
&*ptr |
+ 无别名冲突 |
transmute |
大小相同,位模式有效 |
extern "C" |
签名正确,ABI正确 |
static mut |
同步性得到保证 |
impl Send/Sync |
实际上是线程安全的 |
常见错误
| 错误 |
修复方法 |
| 空指针解引用 |
解引用前检查是否为null |
| 释放后使用 |
确保生命周期有效 |
| 数据竞争 |
添加适当的同步机制 |
| 对齐违规 |
使用 #[repr(C)],检查对齐 |
| 无效位模式 |
使用 MaybeUninit |
| 缺少SAFETY注释 |
添加 // SAFETY: |
已弃用 → 更好的替代方案
| 已弃用 |
替代方案 |
mem::uninitialized() |
MaybeUninit<T> |
对引用使用 mem::zeroed() |
MaybeUninit<T> |
| 裸指针算术运算 |
NonNull<T>、ptr::add |
CString::new().unwrap().as_ptr() |
先存储 CString |
static mut |
AtomicT 或 Mutex |
| 手动extern |
bindgen |
FFI相关库
| 方向 |
库 |
| C → Rust |
bindgen |
| Rust → C |
cbindgen |
| Python |
PyO3 |
| Node.js |
napi-rs |
Claude了解不安全Rust。请重点关注SAFETY注释和代码正确性。