静的解析

コードを実行せずにソースコードを解析し、バグ・脆弱性・スタイル違反を検出するツール

開発ツール品質

静的解析とは

静的解析 (Static Analysis) は、コードを実行せずにソースコードを解析し、バグ、脆弱性、スタイル違反を検出するツールである。コンパイル時やコミット前に問題を発見し、実行時エラーを未然に防ぐ。

静的解析の種類

種類 ツール 検出対象
型チェック TypeScript 型エラー
リンター ESLint, Biome コードスタイル、バグパターン
セキュリティスキャン Semgrep, CodeQL 脆弱性 (SQLi, XSS)
IaC スキャン cfn-lint, Checkov インフラの設定ミス
依存脆弱性 npm audit, Snyk パッケージの脆弱性

TypeScript の型チェック

// TypeScript が実行前にエラーを検出
function add(a: number, b: number): number {
  return a + b;
}
add(1, '2'); // ❌ コンパイルエラー: string は number に代入できない

ESLint

{
  "rules": {
    "no-unused-vars": "error",
    "no-console": "warn",
    "eqeqeq": "error"
  }
}
// ESLint が検出
if (x == null) { }  // ❌ eqeqeq: === を使うべき
const unused = 42;   // ❌ no-unused-vars: 未使用の変数

CI/CD への組み込み

# GitHub Actions
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npx tsc --noEmit        # 型チェック
      - run: npx eslint .             # リンター
      - run: npm audit --audit-level=high  # 脆弱性
      - run: cfn-lint template.yaml   # IaC スキャン

cfn-lint (CloudFormation)

cfn-lint template.yaml
# E3012 Property Runtime not valid. Valid values: nodejs22.x, python3.12...
# W2001 Parameter Environment not used

静的解析 vs 動的解析

観点 静的解析 動的解析
実行 コードを実行しない コードを実行する
速度 高速 低速
カバレッジ 全コードパス 実行されたパスのみ
誤検知 あり 少ない
TypeScript, ESLint テスト, DAST

Shift Left

静的解析は「Shift Left」(問題を開発の早い段階で発見) の代表的な手法。コミット前 (pre-commit hook) で実行すると、CI の待ち時間を削減できる。

# pre-commit hook
npx tsc --noEmit && npx eslint --cache .

詳しくは関連書籍を参照。

関連用語