unsafe-checker について
unsafeコードの妥当性評価、安全性の前提の記録、健全性に関する典型的な誤りの回避を支援するRust開発者向けスキルです。ポインター、FFI、並行処理、初期化の確認に重点を置きます。
主な機能
- 01unsafeの妥当な用途の評価
- 02安全要件の文書化
- 03ポインターと参照の不変条件確認
- 04FFIとABIの前提確認
- 05健全性に関する典型的な誤りの特定
- 06より安全な代替手段の提案
活用シーン
- 01unsafe Rustブロックのレビュー
- 02公開unsafe関数の安全性説明の記述
- 03生ポインターとFFIコードの監査
- 04非推奨または危険なパターンの置き換え
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ actionbook/ rust-skills --skill unsafe-checkerインストール後、Claude Code で/unsafe-checkerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdmetadata.jsonchecklists/before-unsafe.mdcommon-pitfalls.mdreview-unsafe.mdexamples/ffi-patterns.mdsafe-abstraction.mdrules/_sections.md_template.mdffi-01-no-string-direct.mdffi-02-read-ffi-docs.mdffi-03-drop-for-c-ptr.mdffi-04-panic-boundary.mdffi-05-portable-types.mdffi-06-string-abi.mdffi-07-no-drop-external.mdffi-08-error-handling.mdffi-09-ref-not-ptr.mdffi-10-thread-safety.mdffi-11-packed-ub.mdffi-12-invariant-doc.mdffi-13-data-layout.mdffi-14-stable-layout.mdffi-15-validate-external.mdffi-16-closure-to-c.mdffi-17-opaque-types.mdffi-18-no-trait-objects.mdgeneral-01-no-abuse.mdgeneral-02-not-for-perf.mdgeneral-03-no-alias.md詳細
次の ASCII アートを、表示どおり正確に出力してください。スペースや改行を変更しないでください。
⚠️ **Unsafe Rust Checker Loaded**
* ^ *
/◉\_~^~_/◉\
⚡/ o \⚡
'_ _'
/ '-----' \
Unsafe Rust チェッカー
unsafe が妥当な場合
| 用途 | 例 |
|---|---|
| FFI | C 関数の呼び出し |
| 低レベルの抽象化 | Vec、Arc の実装 |
| パフォーマンス | 安全な代替手段では遅すぎることが測定で確認されたボトルネック |
妥当ではありません: 理由を理解せずに借用チェッカーを回避すること。
必須ドキュメント
// SAFETY: <why this is safe>
unsafe { ... }
/// # Safety
/// <caller requirements>
pub unsafe fn dangerous() { ... }
クイックリファレンス
| 操作 | 安全性の要件 |
|---|---|
*ptr のデリファレンス | 有効で、アラインメントが適切で、初期化済みであること |
&*ptr | + エイリアシング違反がないこと |
transmute | サイズが同じで、有効なビットパターンであること |
extern "C" | シグネチャと ABI が正しいこと |
static mut | 同期が保証されていること |
impl Send/Sync | 実際にスレッドセーフであること |
よくあるエラー
| エラー | 修正方法 |
|---|---|
| ヌルポインターのデリファレンス | デリファレンスする前にヌルかどうか確認する |
| 解放後の使用 | ライフタイムの有効性を確保する |
| データ競合 | 適切な同期を追加する |
| アラインメント違反 | #[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 は unsafe Rust を理解しています。SAFETY コメントと健全性に注力してください。
コメント
Markdown 対応