基本情報 2022 サンプル問題 問9:テクノロジ系に関する問題
プログラムのコーディング規約に規定する事項のうち,適切なものはどれか。
- a局所変数は,用途が異なる場合でもデータ型が同じならば,できるだけ同一の変 数を使うようにする。
- b処理性能を向上させるために,ループの制御変数には浮動小数点型変数を使用す る。
- c同様の計算を何度も繰り返すときは,関数の再帰呼出しを用いる。
- d領域割付け関数を使用するときは,割付けができなかったときの処理を記述する。正答
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは d「領域割付け関数を使うときは、割付けできなかった時の処理を書く」 です。
プログラムでメモリ(記憶領域)を借りるとき、「ごめん、もう空きがないよ」 と断られることがあります。これを無視するとプログラムが突然クラッシュしたり、変なデータを書き込んだりして危険。だから 「借りられなかった時にどうするか」を必ず書くべき という規約は正しい。
ほかの選択肢がダメな理由:
- a: 「データ型が同じなら同じ変数を使い回せ」は罠。あとから見た人が「これ何の変数?」と混乱する → バグの元。
- b: 小数(浮動小数点)でループを数えるな。誤差で「ぴったり10回」にならず、ループが終わらない事故が起きる。
- c: 何でもかんでも再帰呼び出しは×。スタック(メモリの一種)を消費しすぎて落ちることがある。普通のループで十分。
👉 覚え方: 「メモリ借りたら借りれたか確認」 がd。失敗時の処理を必ず書く。
なぜこれが正解か
正解は d。`malloc`(C)/`new`(C++/Java)等の 領域割付け関数は失敗する可能性(メモリ不足等)があり、戻り値をチェックして失敗時のエラー処理(ログ、リトライ、安全な終了)を実装するのが規約の鉄則。失敗放置は NULL 参照 → セグフォルト → クラッシュに直結。
各選択肢の解説
- a 不適切: 局所変数の使い回しは 可読性・保守性を損なう。用途別に名前を分けるのが原則。レジスタ割当はコンパイラが最適化するので性能メリットも薄い。
- b 不適切: ループ制御変数に 浮動小数点型は厳禁。IEEE 754 の丸め誤差で `for (f=0.0; f<1.0; f+=0.1)` が10回にならない事故が起きる。整数型必須。
- c 不適切: 再帰は「同様の計算の繰返し」には不適切。スタック消費・呼出しオーバヘッドがあり、単純反復は for/while で書く。再帰は分割統治・木構造探索など本質的に再帰的な問題に限定。
覚え方・ひっかけ注意
コーディング規約 = 「将来のバグを防ぐ予防的ルール」。性能より 可読性・安全性・保守性 を優先。NULLチェック・エラー処理・命名・型選択が基本。MISRA C/CERT C 等の業界標準が存在する。
ソフトウェア工学的背景
コーディング規約は 欠陥混入率の削減 と 保守コストの低減 を目的とする。Capers Jones の調査では、コーディング規約遵守により欠陥発生率が25〜40%削減されるとの報告がある。代表的な業界規約:
- MISRA C/C++: 自動車・組込み系。ISO 26262 機能安全認証で参照。
- CERT C/C++/Java Secure Coding Standard: セキュリティ重視。脆弱性パターン(CWE)を予防する規約。
- Google C++ Style Guide / PEP 8(Python): 大規模プロジェクトの一貫性確保。
メモリ管理の深層
本問の核心 `malloc` 失敗処理は 防御的プログラミング の典型。実装パターン:
```c
void *p = malloc(size);
if (p == NULL) {
/ エラー処理: ログ、リトライ、graceful degradation /
return ERROR_OOM;
}
```
C++ では `new` 失敗時 `std::bad_alloc` 例外を投げる(`new(std::nothrow)` で NULL 返却に切替可)。Java/C# は GC により mall失敗が起きにくいが、`OutOfMemoryError`/`OutOfMemoryException` を捕捉する必要がある場面も。
RAII とスマートポインタ
C++/Rust では RAII(Resource Acquisition Is Initialization) により、スコープを出る際にデストラクタで自動解放され、メモリリークを構造的に防ぐ。スマートポインタ(`std::unique_ptr`, `std::shared_ptr`)を使えば手動 free 不要。Rust は所有権モデルで実行時オーバヘッドなしに同等以上の安全性を達成。
試験での位置づけ
ソフトウェア工学・開発技術の頻出単元。基本情報技術者試験ではコーディング規約、命名規則、コメント、レビュー、リファクタリング、構造化プログラミングが基礎。応用情報以降ではセキュアコーディング(CERT)、静的解析ツール(Coverity, SonarQube)、形式手法(モデル検査、契約プログラミング)、SOLID 原則、デザインパターンまで範囲拡大。
選択肢の発展補足
- a の例外: 短い処理スコープ内のループカウンタ `i` は使い回しが一般的(慣習的に許容される短命変数)。ただし用途が異なるなら別名を推奨。
- b の例外: 浮動小数点でも `for (int i=0; i<=10; i++) { float f = i * 0.1f; ... }` のように 制御は整数、計算で浮動小数点 とすれば安全。
- c の例外: 再帰が自然な問題(木構造、フラクタル、分割統治)では再帰の方が可読性高い。末尾再帰最適化を持つ言語ではループと同等の効率。
- 静的解析の活用: 規約違反は人手レビューより静的解析ツール(clang-tidy, ESLint, RuboCop, Pylint, SpotBugs)で機械的に検出するのが現代の主流。CI/CD パイプラインに組み込みPR時に自動チェック。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 2022 サンプル問題 問9/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。