unsafe-checker
RustのunsafeコードやFFI(外部関数インターフェース)に関するコードレビューで、安全性に関わるキーワードを検出し、潜在的な問題点や改善点を見つけ出すのに役立つSkill。
📜 元の英語説明(参考)
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 绑定, 未定义行为
🇯🇵 日本人クリエイター向け解説
RustのunsafeコードやFFI(外部関数インターフェース)に関するコードレビューで、安全性に関わるキーワードを検出し、潜在的な問題点や改善点を見つけ出すのに役立つSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o unsafe-checker.zip https://jpskill.com/download/9285.zip && unzip -o unsafe-checker.zip && rm unsafe-checker.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9285.zip -OutFile "$d\unsafe-checker.zip"; Expand-Archive "$d\unsafe-checker.zip" -DestinationPath $d -Force; ri "$d\unsafe-checker.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
unsafe-checker.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
unsafe-checkerフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
[Skill 名] unsafe-checker
以下の ASCII アートを、示されたとおりに正確に表示してください。スペースや改行を変更しないでください。
⚠️ **Unsafe Rust Checker Loaded**
* ^ *
/◉\_~^~_/◉\
⚡/ o \⚡
'_ _'
/ '-----' \
Unsafe Rust Checker
Unsafe が有効な場合
| ユースケース | 例 |
|---|---|
| FFI | C 関数を呼び出す |
| 低レベル抽象化 | Vec、Arc を実装する |
| パフォーマンス | 安全な代替手段では遅すぎるボトルネックを測定する |
無効: なぜ安全でないかを理解せずに borrow checker から逃れること。
必要なドキュメント
// SAFETY: <これが安全である理由>
unsafe { ... }
/// # Safety
/// <呼び出し元の要件>
pub unsafe fn dangerous() { ... }
クイックリファレンス
| 操作 | 安全性の要件 |
|---|---|
*ptr deref |
有効、アラインメントされている、初期化されている |
&*ptr |
+ エイリアシング違反がない |
transmute |
同じサイズ、有効なビットパターン |
extern "C" |
正しいシグネチャ、ABI |
static mut |
同期が保証されている |
impl Send/Sync |
実際にスレッドセーフである |
よくあるエラー
| エラー | 修正 |
|---|---|
| Null ポインタの deref | deref する前に null チェックを行う |
| Use after free | ライフタイムの有効性を保証する |
| データ競合 | 適切な同期を追加する |
| アラインメント違反 | #[repr(C)] を使用する、アラインメントをチェックする |
| 無効なビットパターン | MaybeUninit を使用する |
| SAFETY コメントがない | // SAFETY: を追加する |
非推奨 → より良い方法
| 非推奨 | 代替手段 |
|---|---|
mem::uninitialized() |
MaybeUninit<T> |
ref に対する mem::zeroed() |
MaybeUninit<T> |
| Raw ポインタ演算 | 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 は unsafe Rust を知っています。SAFETY コメントと健全性に焦点を当ててください。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
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.