基本情報技術者 2013年 秋期 午前(科目A) 問49
問題文
プログラム実行中の特定の時点で成立する変数間の関係や条件を記述した論理式を埋め込んで、そのプログラムの正当性を検証する手法はどれか。
選択肢
ア:アサーションチェック(正解)
イ:コード追跡
ウ:スナップショットダンプ
エ:テストカバレッジ分析
問題: プログラム実行中の特定の時点で成立する変数間の関係や条件を記述した論理式を埋め込んで、そのプログラムの正当性を検証する手法はどれか 【午前2 解説】
要点まとめ
- 結論:ア(アサーションチェック)はプログラム中に論理式を埋め込み、実行時に条件を評価して正当性を検証する手法です。
- 根拠:問題文の「論理式を埋め込んで実行時に検証する」という記述は、実行時に評価されるアサーションの定義と一致します。
- 差がつくポイント:アサーションは内部整合性の即時検出に優れ、テストカバレッジやダンプとは目的とタイミングが異なる点を押さえることが重要です。
正解の理由
正解: ア
アサーション(assertion)は、プログラムの特定箇所に「この時点でこの条件が成立しているはずだ」という論理式(条件)を明示的に記述し、実行時にその式を評価して偽ならば異常終了や例外報告を行う仕組みです。これにより、想定外の状態を早期に検出して原因箇所を特定できます。問題文はまさに「論理式を埋め込んで実行時に正当性を検証する」手法を述べており、アサーションチェックが該当します。
アサーション(assertion)は、プログラムの特定箇所に「この時点でこの条件が成立しているはずだ」という論理式(条件)を明示的に記述し、実行時にその式を評価して偽ならば異常終了や例外報告を行う仕組みです。これにより、想定外の状態を早期に検出して原因箇所を特定できます。問題文はまさに「論理式を埋め込んで実行時に正当性を検証する」手法を述べており、アサーションチェックが該当します。
- アサーションの特徴:コード内に直接書く、実行時評価、内部不整合検出、開発時のデバッグ補助。
- 他の選択肢は目的や手法が異なるため不正解です(詳細は選択肢別解説参照)。
よくある誤解
- アサーションは単なるテストと同じ:誤り。アサーションは通常「プログラマ的不変条件」をチェックし、外部入力の検証や仕様確認を全面的に代替するものではありません。
- アサーションは常に本番環境で有効にすべき:誤り。言語や運用方針によっては本番で無効化されることがあり、パフォーマンスや安全性を考慮して扱いを分けます。
- アサーションは状態のスナップショットを保存する手段である:誤り。アサーションは条件判定であり、ダンプやログと目的が異なります。
解法ステップ
- 問題文のキーワードを確認:「論理式」「埋め込む」「実行中」「正当性を検証」など。
- 各選択肢の定義を思い出す:アサーション、コード追跡(トレース)、スナップショットダンプ、テストカバレッジ。
- 「埋め込み」と「実行時評価」に合致するものがアサーションであると判断する。
- 他の選択肢が何をするかを照らし合わせて誤りを確定する。
選択肢別の誤答解説
- ア: 正解。プログラム内に論理式を書いて実行時に評価する手法で、条件が満たされなければエラーを報告します。
- イ(コード追跡): 関数呼び出しや変数の変化を追う手法(トレース・ロギング)で、埋め込むのはログ出力やトレースポイントであり「論理式を埋め込む」ことが本質ではありません。
- ウ(スナップショットダンプ): 実行時にメモリや状態をその時点で保存する手法で、状態を記録して後で解析する目的。論理式評価や即時検出とは異なります。
- エ(テストカバレッジ分析): テストがどの程度コードを実行しているかを測る指標・解析手法で、プログラムに論理式を埋め込んで実行時に検証する手法ではありません。
補足コラム
- 実務での使い分け:アサーションは「プログラマの仮定(前提条件・後件条件・不変条件)」をチェックするために使い、ユーザ入力の検証やエラー処理は例外や入力チェックで行うのが望ましいです。
- 言語ごとの挙動:CのassertはNDEBUGで削除可能、Pythonのassertは最適化モード(-O)で無効化、Javaのassertはデフォルトで無効化され起動オプションで有効化します。運用ポリシーに応じた使い方を検討してください。
- 関連する概念:Design by Contract(設計による契約)や形式手法(静的検証)と組み合わせると、より堅牢な検証が可能です。
コード例(参考)
# Python の簡単なアサーション例
def divide(a, b):
assert b != 0, "除数が0です"
return a / b
/* C の assert の例 */
#include <assert.h>
int main() {
int x = 5;
assert(x > 0); /* 条件が偽ならプログラムを中断 */
}
FAQ
Q1: アサーションと例外処理はどちらを使うべきですか?
A1: アサーションは「プログラマが想定している不変条件のチェック」に使い、例外は外部入力や予期し得るエラー条件の処理に使います。ユーザ由来の入力検証は例外/エラー処理で行うべきです。
A1: アサーションは「プログラマが想定している不変条件のチェック」に使い、例外は外部入力や予期し得るエラー条件の処理に使います。ユーザ由来の入力検証は例外/エラー処理で行うべきです。
Q2: 本番環境でアサーションを有効にしてもいいですか?
A2: 慎重に判断する必要があります。パフォーマンスやセキュリティ上の理由で無効化することが一般的ですが、重要な安全性チェックは別の手段で常時行うべきです。
A2: 慎重に判断する必要があります。パフォーマンスやセキュリティ上の理由で無効化することが一般的ですが、重要な安全性チェックは別の手段で常時行うべきです。
Q3: アサーションはテストの代わりになりますか?
A3: いいえ。アサーションは補助的なチェックであり、単体テストや統合テストを置き換えるものではありません。テストは仕様の検証と回帰防止が主目的です。
A3: いいえ。アサーションは補助的なチェックであり、単体テストや統合テストを置き換えるものではありません。テストは仕様の検証と回帰防止が主目的です。
Q4: アサーションが多すぎると問題ですか?
A4: 開発中は多めに置いてデバッグ効率を上げることが有効ですが、本番では不要なコストや情報漏洩につながる可能性があるため注意が必要です。
A4: 開発中は多めに置いてデバッグ効率を上げることが有効ですが、本番では不要なコストや情報漏洩につながる可能性があるため注意が必要です。
関連キーワード: アサーション, アサーションチェック, アサート, デバッグ, バグ検出, スナップショットダンプ, コードトレース, テストカバレッジ, 不変条件, Design by Contract, 実行時検証

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

