| name | rust-code-quality |
| description | Rustコードの品質管理を支援するスキル。clippy警告の解釈と修正、rustfmtの設定、cargo audit/cargo denyによるセキュリティ監査、unsafe監査、miriによる未定義動作検出をカバー。「clippy」「lint」「rustfmt」「フォーマット」「コード品質」「unsafe」「監査」「audit」「deny」「miri」「コードレビュー」「Rustのベストプラクティス」「イディオマティック」など品質改善に関する要求があれば必ずこのスキルを使うこと。Rustコードのレビュー依頼時にも参照すること。 |
Rust コード品質スキル
Rustコードの品質を多層的に担保するためのガイド。lint → format → audit → unsafe監査 の順で適用する。
Clippy(静的解析)
基本実行
cargo clippy
cargo clippy --all-targets --all-features
cargo clippy -- -D warnings
よく出る警告と対処パターン
needless_return — 末尾 return を式に変換:
fn add(a: i32, b: i32) -> i32 {
return a + b;
}
fn add(a: i32, b: i32) -> i32 {
a + b
}
clone_on_copy — Copy型に .clone() は不要:
let x: i32 = 42;
let y = x;
map_unwrap_or — map().unwrap_or() を map_or() に:
opt.map(|x| x * 2).unwrap_or(0)
opt.map_or(0, |x| x * 2)
single_match — 1パターンの match は if let に:
match opt {
Some(v) => println!("{v}"),
_ => {}
}
if let Some(v) = opt {
println!("{v}");
}
プロジェクト全体の Clippy 設定
clippy.toml または Cargo.toml で設定:
[lints.clippy]
pedantic = { level = "warn", priority = -1 }
module_name_repetitions = "allow"
must_use_candidate = "allow"
missing_errors_doc = "allow"
#![allow()] はファイル単位ではなく Cargo.toml の [lints] で管理する方が一元的で見通しが良い。
rustfmt(フォーマッタ)
基本実行
cargo fmt
cargo fmt -- --check
rustfmt.toml カスタマイズ
edition = "2024"
max_width = 100
tab_spaces = 4
use_field_init_shorthand = true
use_try_shorthand = true
imports_granularity = "Crate"
group_imports = "StdExternalCrate"
imports_granularity と group_imports は nightly 限定だが、フォーマットの一貫性に大きく貢献する。stable で使いたい場合は手動で同等のルールを守る。
セキュリティ監査
cargo audit
既知の脆弱性を検出:
cargo install cargo-audit
cargo audit
cargo audit fix
cargo deny
ライセンス互換性 + 脆弱性 + 重複依存を包括的にチェック:
cargo install cargo-deny
cargo deny init
cargo deny check
deny.toml の重要設定:
[licenses]
allow = ["MIT", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "ISC", "Zlib"]
confidence-threshold = 0.8
[bans]
multiple-versions = "warn"
[advisories]
vulnerability = "deny"
unmaintained = "warn"
unsafe 監査
unsafe ブロックの洗い出し
grep -rn "unsafe" src/
cargo install cargo-geiger
cargo geiger
unsafe を使うときのルール
- Safety コメント必須 — なぜ安全かを
// SAFETY: コメントで説明する
- 最小スコープ — unsafe ブロックは必要最小限の範囲に
- 安全な抽象でラップ — unsafe な操作は安全な関数/型で包む
unsafe fn read_byte(ptr: *const u8, offset: usize) -> u8 {
*ptr.add(offset)
}
pub fn safe_read(slice: &[u8], offset: usize) -> Option<u8> {
slice.get(offset).copied()
}
miri(未定義動作検出)
rustup +nightly component add miri
cargo +nightly miri test
cargo +nightly miri test -- test_name
miri が検出するもの:
- メモリリーク
- use-after-free
- データ競合
- 不正なアラインメント
- 未初期化メモリの読み取り
miri は遅いので CI では nightly ジョブとして分離するのが一般的。
CI パイプライン推奨構成
jobs:
check:
steps:
- run: cargo fmt -- --check
- run: cargo clippy --all-targets --all-features -- -D warnings
- run: cargo test --all-features
- run: cargo audit
- run: cargo deny check
miri:
steps:
- run: rustup default nightly
- run: rustup component add miri
- run: cargo miri test
コードレビュー時のチェックリスト
Rustコードをレビューするときは以下を確認: