基本情報技術者 2010年 秋期 午前(科目A) 問23
問題文
プログラムの静的解析ツールで検出できるものはどれか。
選択肢
ア:関数ごとの実行処理時間
イ:後に使用されない変数への代入(正解)
ウ:プログラム仕様に対応する処理の記述漏れ
エ:用意したテストケースでは実行されなかった命令
プログラムの静的解析ツールで検出できるものはどれか。【午前2 解説】
要点まとめ
- 結論: 静的解析はソースコードを実行せずに構文やデータフローを解析し、未使用変数などの問題を検出できます。
- 根拠: 静的解析は実行時の入力や実行経路に依存せず、代入や参照の有無、制御フローの不整合を解析するためです。
- 差がつくポイント: 性能やテスト未実行の命令は実行時情報が必要なので動的解析/プロファイリングと区別して考える理解が重要です。
正解の理由
選択肢の中で静的解析ツールが直接検出できるのは、後に使用されない変数への代入です。静的解析はソースコードの構造とデータフローを分析し、ある変数への代入後にその値が参照されない(assigned but never used)のようなパターンを検出できます。従って、イが正解です。
よくある誤解
- 静的解析で実行時の性能(関数ごとの実行処理時間)が分かると思い込む誤解。処理時間は実行環境や入力に依存するためプロファイラやベンチマークが必要です。
- 「テストで実行されなかった命令」=静的解析で検出できると考える誤り。これはテスト実行結果に基づくカバレッジ情報であり動的解析(テスト実行)が必要です。
- 静的解析で仕様との整合性や扱い漏れが完全に分かると過信する誤り。仕様解釈や業務ロジックの欠落は自動判定が難しく、レビューやテストが補完します。
解法ステップ
- 「静的解析」の定義を確認:コードを実行せずに解析する手法であることを思い出す。
- 各選択肢が実行時情報を必要とするか否かで分類する。実行時依存 = 動的解析/プロファイリングが必要。
- 実行不要でソースから検出可能なもの(未使用変数、構文エラー、到達不能コードの一部など)を選ぶ。
- 該当する選択肢(イ)を選択する。
選択肢別の誤答解説
- ア: 関数ごとの実行処理時間
- 実行時間は入力データやハードウェア、実行時の最適化に依存します。静的解析では精確な時間測定は不可能で、プロファイラによる動的測定が必要です。
- イ: 後に使用されない変数への代入
- 静的解析が得意とする典型例です。未使用変数の代入はデータフロー解析で検出され、「assigned but never used」等の警告になります。
- ウ: プログラム仕様に対応する処理の記述漏れ
- 仕様適合性の欠如は文脈やドメイン知識が必要で、自動で確実に判定するのは困難です。静的解析はヒューリスティックに警告できても完全判定はできません。
- エ: 用意したテストケースでは実行されなかった命令
- これはテスト実行結果(カバレッジ)に関する情報であり、動的解析(テスト実行+カバレッジ測定)で判定します。静的解析は「到達不可能コード」の検出はできる場合がありますが、"用意したテストケースで実行されなかった" という事実そのものは動的情報です。
補足コラム
静的解析と動的解析は目的が補完的です。静的解析ツール(例: ESLint, Pylint, Clang-Tidy, SpotBugs, SonarQube)は構文ミス、型の不整合、未使用変数、潜在的なヌル参照、デッドコードの候補、不適切なAPI使用などを検出します。一方、プロファイラやテストカバレッジツールは実行時の振る舞い(処理時間、メモリ使用、テストで実行されたかどうか)を測定します。
例(Python):
# sample.py
def compute():
x = 10
y = 20 # y に代入したが後で使われない
return x * 2
print(compute())
上記を Pylint 等で解析すると "y が割り当てられているが使用されていない" と警告されます。性能問題は実行して測定する必要があります。
FAQ
Q1: 静的解析で全てのバグは見つかりますか?
A1: いいえ。静的解析は多くのクラスの問題を早期発見できますが、仕様の誤りや実行時の振る舞いに依存するバグは見逃すことが多く、テストやレビューが必要です。
A1: いいえ。静的解析は多くのクラスの問題を早期発見できますが、仕様の誤りや実行時の振る舞いに依存するバグは見逃すことが多く、テストやレビューが必要です。
Q2: 未使用変数とデッドコードは同じですか?
A2: 関連はありますが異なります。未使用変数は変数レベルの問題、一方デッドコードは到達しない関数やブロックなど実行されないコード全体を指します。どちらも静的解析で検出されやすいです。
A2: 関連はありますが異なります。未使用変数は変数レベルの問題、一方デッドコードは到達しない関数やブロックなど実行されないコード全体を指します。どちらも静的解析で検出されやすいです。
Q3: 静的解析で性能改善点を得る方法はありますか?
A3: 間接的には可能です(例えば不必要なループや重複処理の指摘)が、正確な性能評価や最適化効果の確認は動的解析(プロファイリング)が必須です。
A3: 間接的には可能です(例えば不必要なループや重複処理の指摘)が、正確な性能評価や最適化効果の確認は動的解析(プロファイリング)が必須です。
関連キーワード: 静的解析、動的解析、未使用変数、デッドコード、コードカバレッジ、プロファイリング、Lint、Pylint、ESLint、SonarQube、バグ検出、ソフトウェア品質

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

