---
title: "静的解析と動的解析の違いとは？検査タイミングで整理【SG試験】"
description: "静的解析と動的解析は、ソフトウェアの脆弱性や不具合を見つける検査手法です。静的解析はプログラムを動かさずコードや設定を確認し、動的解析は実行時の挙動を見る点が異なります。SAST・DASTとの関係をSG試験向けに整理します。SG試験の出題文で迷いやすい判断ポイントも確認します。"
last_modified_at: "2026-05-18"
canonical_url: "https://stemtazoo.github.io/sg/static-dynamic-analysis/"
section: "sg"
---

## まず結論
- **静的解析**は、プログラムを実行せずに、ソースコードや設計情報を確認して問題を見つける方法です。
- **動的解析**は、プログラムを実際に動かして、入力に対する応答や挙動から問題を見つける方法です。
- SG試験では、**「動かさずに調べる」のか「動かして挙動を見る」のか**で切り分けることが重要です。

## 直感的な説明
静的解析と動的解析の違いは、車の点検にたとえると分かりやすいです。

- 静的解析：車を走らせずに、設計図や部品の状態を確認する
- 動的解析：実際に車を走らせて、ブレーキやエンジンの動きを確認する

ソフトウェアでも同じです。

静的解析は、ソースコードを見て「危ない書き方がないか」「ルール違反がないか」を確認します。

動的解析は、ソフトウェアを動かして「入力に対して正しく動くか」「異常な入力で止まらないか」を確認します。

つまり、判断基準はとてもシンプルです。

**実行しないで調べる → 静的解析**  
**実行して調べる → 動的解析**

SG試験では、この違いを押さえるだけで選択肢をかなり切りやすくなります。

## 定義・仕組み
静的解析は、ソフトウェアを実行せずに、ソースコードや設定、設計情報などを確認する検査です。

たとえば、次のような問題を見つける目的で使われます。

- 危険な関数や命令の使用
- 入力値チェックの不足
- コーディング規約違反
- バッファオーバーフローにつながる可能性
- 使われていない変数や到達しない処理

一方、動的解析は、ソフトウェアを実際に動かして、実行中の挙動を確認する検査です。

たとえば、次のような観点で確認します。

- 想定外の入力で異常終了しないか
- 実行時にエラーが発生しないか
- 認証やアクセス制御が正しく働くか
- 実際の通信や画面操作で問題が起きないか
- 攻撃に近い操作をしたときに安全に処理できるか

IPAのセキュア・プログラミング講座でも、ソースコードの静的検査ツールを使って脆弱性を比較的手早く検出する方法が紹介されています。詳しくは、IPAの[ツールの利用](https://www.ipa.go.jp/archive/security/vuln/programming/cc/chapter1/cc1-7.html)が参考になります。

また、動的解析の代表例として、前回整理した**ファジング**があります。ファジングは、問題を引き起こしそうな多様なデータを入力し、ソフトウェアの応答や挙動から脆弱性を見つける方法です。

## どんな場面で使う？
静的解析は、主に**開発中やレビュー時**に使われます。

ソースコードがあれば実行前でも確認できるため、早い段階で問題を見つけやすいのが特徴です。

たとえば、次のような場面に向いています。

- 開発中に危険なコードを早めに見つけたい
- コーディング規約違反を自動で確認したい
- 人のレビュー前に機械的にチェックしたい
- 継続的インテグレーションで毎回チェックしたい

一方、動的解析は、主に**テスト時やリリース前の検証**で使われます。

実際に動かして確認するため、実行時にしか分からない問題を見つけやすいです。

たとえば、次のような場面に向いています。

- 画面操作や通信を含めて確認したい
- 実際の入力に対する応答を確認したい
- 認証やアクセス制御の動きを確認したい
- 攻撃に近い入力を与えて耐性を確認したい

ただし、どちらか一方だけで十分とは限りません。

静的解析は、実行しないので早く広く確認できますが、実際の動作までは確認できません。

動的解析は、実際の挙動を確認できますが、実行した範囲しか確認できない場合があります。

そのため、実務では**静的解析と動的解析を組み合わせる**ことが多いです。

## よくある誤解・混同
静的解析と動的解析は、SG試験で混同しやすい用語です。

| 観点 | 静的解析 | 動的解析 |
|---|---|---|
| プログラムを実行するか | 実行しない | 実行する |
| 主な対象 | ソースコード、設計情報、設定など | 実行中のソフトウェア |
| 得意なこと | 危険な書き方やルール違反を早めに見つける | 実際の入力や操作に対する挙動を確認する |
| 使う場面 | 開発中、レビュー、CIなど | テスト、リリース前検証、脆弱性診断など |
| 代表例 | ソースコード検査ツール | ファジング、実行時テスト、脆弱性診断 |

SG試験では、次のような表現に注意します。

- **「ソースコードを解析する」**  
  → 静的解析を疑います。

- **「プログラムを実行せずに確認する」**  
  → 静的解析です。

- **「実際に動作させる」**  
  → 動的解析を疑います。

- **「入力を与えて応答や挙動を見る」**  
  → 動的解析です。

- **「多様なデータを入力して異常終了を確認する」**  
  → 動的解析の中でも、ファジングに近い説明です。

よくあるひっかけは、**静的解析を「テストだから実行するもの」と思い込むこと**です。

静的解析も検査の一種ですが、プログラムは実行しません。

逆に、動的解析はソースコードを読んで判断するのではなく、動かした結果から判断します。

### 判断軸の再確認（試験直前）
- **目的**を基準に切る：何を防ぐ／何を見つけるための手法か。
- **実施タイミング**を切る：開発中に行うか、稼働中の環境で行うか。
- **言い過ぎ表現**に注意：「完全に防げる」「これだけで十分」は誤りになりやすい。

## まとめ（試験直前用）
- 静的解析は、**プログラムを実行せずに調べる**検査です。
- 動的解析は、**プログラムを実行して挙動を見る**検査です。
- 「ソースコードを解析する」なら静的解析を疑います。
- 「入力を与えて応答を見る」なら動的解析を疑います。
- SG試験では、**実行するかどうか**を最初の判断基準にします。

### 確認問題

静的解析と動的解析の違いとして、最も適切なものはどれか。

ア. 静的解析はネットワーク通信を暗号化する方法であり、動的解析は通信経路を冗長化する方法である。  
イ. 静的解析はプログラムを実行せずにソースコードなどを調べる方法であり、動的解析はプログラムを実行して挙動を確認する方法である。  
ウ. 静的解析は運用開始後のログだけを確認する方法であり、動的解析は開発前の要件定義だけを確認する方法である。  
エ. 静的解析はマルウェア感染端末を隔離する方法であり、動的解析は端末のネットワーク接続を許可する方法である。

<details>
<summary>回答と解説を表示</summary>

正解は **イ** です。

静的解析は、プログラムを実行せずに、ソースコードや設計情報などを確認して問題を見つける方法です。

動的解析は、プログラムを実際に動かして、入力に対する応答や実行中の挙動から問題を見つける方法です。

アは暗号化や冗長化の説明であり、静的解析・動的解析の説明ではありません。  
ウはログ確認や要件定義の話になっており、切り分けが不適切です。  
エは検疫ネットワークに近い説明であり、解析手法の説明ではありません。

</details>
