コード品質 レッスン5
静的解析とリンター
コードを実行せずに問題を検出する静的解析ツールとリンターの役割、導入・運用のポイントを学ぶ
静的解析とは何か
静的解析(Static Analysis)とは、 プログラムを実際に実行することなく、ソースコードそのものを解析して問題を検出する手法です。 代表的なツールにリンター(構文・スタイル・潜在バグを検出)や 型チェッカー(型の不整合を検出)があります。
静的解析でできること
- • 未使用の変数・importの検出
- • 型の不整合の検出
- • セキュリティ上危険なパターンの検出
- • コーディング規約からの逸脱の検出
静的解析でできないこと
- • 実行時にしか分からないロジックの誤り
- • ビジネス要件を満たしているかの確認
- • パフォーマンスの実測
リンターが検出するパターン例
// 検出例1: 使われていない変数
function getUser(id) {
const debugLabel = "getUser call"; // 未使用 -> リンター警告
return db.users.find(id);
}
// 検出例2: 意図しない代入 (== vs ===、= vs ==)
if (status = "done") { // 代入になってしまっている -> リンター警告
console.log("完了");
}
// 検出例3: to-do放置や到達不能コード
function calculate(x) {
return x * 2;
console.log("never runs"); // 到達不能 -> リンター警告
}これらは実行時にたまたま動いてしまうこともあり、人間の目だけでは見落としがちです。 リンターは同じ規則を機械的に、疲れることなく毎回チェックしてくれます。
導入・運用のポイント
1. CIに組み込み、必須ゲートにする
人が気づいたら直すのではなく、リンターが失敗したらマージできない仕組みにすることで、 チーム全体で規約を守り続けられます。
# .github/workflows/ci.yml (抜粋)
name: CI
on: [pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run lint2. ルールはチームで合意してから厳格化する
最初から全ルールを最大厳格度で有効にすると、既存コードとの整合が取れず形骸化しがちです。 重要なルールから段階的に有効化していきます。
3. 自動修正できるものは自動修正に任せる
フォーマットやimportの並び順など、機械的に直せるものは--fixで自動修正し、 人間はロジックの検討に集中します。
よくある落とし穴
- • 警告を無効化(disable)しすぎて、リンターが形骸化してしまう
- • 型チェッカーの
any型を多用し、型の恩恵を失う - • ルール変更を一度に大量適用し、巨大な差分のPRを作ってしまう
ポイント
- • 静的解析はコードを実行せずに問題を検出する手法
- • リンターは未使用変数・意図しない代入・到達不能コードなどを機械的に検出する
- • CIに組み込み、失敗したらマージできない必須ゲートにする
- • 自動修正可能なものは自動修正に任せ、人間はロジックに集中する
確認クイズ
1 / 3静的解析の説明として正しいものはどれか?