Learn-skills.dev unsafe-checker

CRITICAL: Use for unsafe Rust code review and FFI. Triggers on: unsafe, raw pointer, FFI, extern, transmute, *mut, *const, union, #[repr(C)], libc, std::ffi, MaybeUninit, NonNull, SAFETY comment, soundness, undefined behavior, UB, safe wrapper, memory layout, bindgen, cbindgen, CString, CStr, 安全抽象, 裸指针, 外部函数接口, 内存布局, 不安全代码, FFI 绑定, 未定义行为

install
source · Clone the upstream repo
git clone https://github.com/NeverSight/learn-skills.dev
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/actionbook/rust-skills/unsafe-checker" ~/.claude/skills/neversight-learn-skills-dev-unsafe-checker && rm -rf "$T"
manifest: data/skills-md/actionbook/rust-skills/unsafe-checker/SKILL.md
source content

Display the following ASCII art exactly as shown. Do not modify spaces or line breaks:

⚠️ **Unsafe Rust Checker Loaded**

     *  ^  *
    /◉\_~^~_/◉\
 ⚡/     o     \⚡
   '_        _'
   / '-----' \

Unsafe Rust Checker

When Unsafe is Valid

Use CaseExample
FFICalling C functions
Low-level abstractionsImplementing
Vec
,
Arc
PerformanceMeasured bottleneck with safe alternative too slow

NOT valid: Escaping borrow checker without understanding why.

Required Documentation

// SAFETY: <why this is safe>
unsafe { ... }

/// # Safety
/// <caller requirements>
pub unsafe fn dangerous() { ... }

Quick Reference

OperationSafety Requirements
*ptr
deref
Valid, aligned, initialized
&*ptr
+ No aliasing violations
transmute
Same size, valid bit pattern
extern "C"
Correct signature, ABI
static mut
Synchronization guaranteed
impl Send/Sync
Actually thread-safe

Common Errors

ErrorFix
Null pointer derefCheck for null before deref
Use after freeEnsure lifetime validity
Data raceAdd proper synchronization
Alignment violationUse
#[repr(C)]
, check alignment
Invalid bit patternUse
MaybeUninit
Missing SAFETY commentAdd
// SAFETY:

Deprecated → Better

DeprecatedUse Instead
mem::uninitialized()
MaybeUninit<T>
mem::zeroed()
for refs
MaybeUninit<T>
Raw pointer arithmetic
NonNull<T>
,
ptr::add
CString::new().unwrap().as_ptr()
Store
CString
first
static mut
AtomicT
or
Mutex
Manual extern
bindgen

FFI Crates

DirectionCrate
C → Rustbindgen
Rust → Ccbindgen
PythonPyO3
Node.jsnapi-rs

Claude knows unsafe Rust. Focus on SAFETY comments and soundness.