mcpbeat Sign in

Unsafe Checker Skill for Claude

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 绑定, 未定义行为

622 tokens
context cost
SKILL.md, read when the skill is used
56
files
plus reference files
0
copies elsewhere
how many repositories repackaged it
108
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/moeru-ai/auv --skill unsafe-checker

What comes with it

138 834 bytes besides the instruction
AGENTS.md
checklists/before-unsafe.md
checklists/common-pitfalls.md
checklists/review-unsafe.md
examples/ffi-patterns.md
examples/safe-abstraction.md
rules/_sections.md
rules/_template.md
rules/ffi-01-no-string-direct.md
rules/ffi-02-read-ffi-docs.md
rules/ffi-03-drop-for-c-ptr.md
rules/ffi-04-panic-boundary.md
rules/ffi-05-portable-types.md
rules/ffi-06-string-abi.md
rules/ffi-07-no-drop-external.md
rules/ffi-08-error-handling.md
rules/ffi-09-ref-not-ptr.md
rules/ffi-10-thread-safety.md
rules/ffi-11-packed-ub.md
rules/ffi-12-invariant-doc.md
rules/ffi-13-data-layout.md
rules/ffi-14-stable-layout.md
rules/ffi-15-validate-external.md
rules/ffi-16-closure-to-c.md
rules/ffi-17-opaque-types.md
rules/ffi-18-no-trait-objects.md
rules/general-01-no-abuse.md
rules/general-02-not-for-perf.md
rules/general-03-no-alias.md
rules/io-01-raw-handle.md
rules/mem-01-repr-layout.md
rules/mem-02-no-other-process.md
rules/mem-03-no-auto-drop-foreign.md
rules/mem-04-reentrant.md
rules/mem-05-bitfield-crates.md
rules/mem-06-maybeuninit.md
rules/ptr-01-no-thread-share.md
rules/ptr-02-prefer-nonnull.md
rules/ptr-03-phantomdata.md
rules/ptr-04-alignment.md

The instruction itself

7 sections, as written by the author

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 Case | Example |

|----------|---------|

| FFI | Calling C functions |

| Low-level abstractions | Implementing Vec, Arc |

| Performance | Measured 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

| Operation | Safety 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

| Error | Fix |

|-------|-----|

| Null pointer deref | Check for null before deref |

| Use after free | Ensure lifetime validity |

| Data race | Add proper synchronization |

| Alignment violation | Use #[repr(C)], check alignment |

| Invalid bit pattern | Use MaybeUninit |

| Missing SAFETY comment | Add // SAFETY: |

Deprecated → Better

| Deprecated | Use 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

| Direction | Crate |

|-----------|-------|

| C → Rust | bindgen |

| Rust → C | cbindgen |

| Python | PyO3 |

| Node.js | napi-rs |

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

How to use it

Copy the folder

Take moeru-ai/unsafe-checker from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.