コード品質 レッスン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 lint

2. ルールはチームで合意してから厳格化する

最初から全ルールを最大厳格度で有効にすると、既存コードとの整合が取れず形骸化しがちです。 重要なルールから段階的に有効化していきます。

3. 自動修正できるものは自動修正に任せる

フォーマットやimportの並び順など、機械的に直せるものは--fixで自動修正し、 人間はロジックの検討に集中します。

よくある落とし穴

  • • 警告を無効化(disable)しすぎて、リンターが形骸化してしまう
  • • 型チェッカーのany型を多用し、型の恩恵を失う
  • • ルール変更を一度に大量適用し、巨大な差分のPRを作ってしまう

ポイント

  • • 静的解析はコードを実行せずに問題を検出する手法
  • • リンターは未使用変数・意図しない代入・到達不能コードなどを機械的に検出する
  • • CIに組み込み、失敗したらマージできない必須ゲートにする
  • • 自動修正可能なものは自動修正に任せ、人間はロジックに集中する

確認クイズ

1 / 3

静的解析の説明として正しいものはどれか?