静的解析
コードを実行せずにソースコードを解析し、バグ・脆弱性・スタイル違反を検出するツール
開発ツール品質
静的解析とは
静的解析 (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 .
詳しくは関連書籍を参照。