基本情報 平成30年度 春期 問7:テクノロジ系に関する問題
プログラムのコーディング規約に規定する事項のうち, 適切かものはどれか。
- a局所変数は, 用途が異なる場合でもデータ型が同じならば, できるだけ同一の 変数を使うようにする。
- b処理性能を向上させるために, ループの制御変数には浮動小数点型変数を使用 する。
- c同様の計算を何度も繰り返すときは, 関数の再帰呼出しを用いる。
- d領域割付け関数を使用するときは, 割付けができなかったときの処理を記述す る。正答
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは d です。
コーディング規約=「みんなで読みやすく安全に書くためのルール集」。
領域割付け関数(malloc/newなど)はメモリが足りないと失敗することがあるので、「失敗したときの処理を必ず書いておく」ことが大事。書いてないと、NULL を触ってクラッシュします。
👉 覚え方:確保失敗の対処はマスト!
ほかの選択肢:a 用途違うのに同じ変数を流用=バグの温床/b ループ変数に浮動小数点=誤差で無限ループの危険/c 単純繰り返しに再帰=スタックオーバーフローの危険。
なぜこれが正解か
正解は d。動的メモリ割付け関数(C の malloc、C++ の new、Java/C#の new 等)は、メモリ不足等で割付けに失敗する可能性がある。失敗時の戻り値(NULL ポインタや例外)に対する適切な処理を必ず記述するのがコーディング規約として正しい。これを怠るとNULL参照によるクラッシュ・未定義動作を招く。
各選択肢の解説
- a 用途が違うのに同じ変数を流用:変数の使い回しは意図が不明瞭になり可読性・保守性が低下。コーディング規約として推奨されない(不適切)。
- b ループ制御変数に浮動小数点を使用:累積誤差で終了判定不能または反復回数が変わるバグの原因。整数で制御が原則。
- c 同様計算を関数の再帰呼出しで実現:反復ループで足りる場合、再帰は不要な性能低下とスタック消費を招く。
- d 領域割付け失敗時の処理を記述 → 正解。
覚え方・ひっかけ注意
コーディング規約の基本3原則:(1) 可読性 (2) 保守性 (3) 安全性。本問は安全性カテゴリ。MISRA-C、Google C++ Style Guide、PEP 8(Python)、Effective Java 等が代表的規約。静的解析ツール(Coverity、SonarQube、PMD、ESLint)で自動チェックが現代の標準。
主要なコーディング規約
- MISRA-C / MISRA-C++:自動車業界。安全性重視(ISO 26262 と連携)。例:goto 禁止、動的メモリ割当禁止(ASIL D)。
- CERT C / Java / Python Coding Standard:セキュリティ重視。
- Google Style Guide:C++/Java/Python/Go等の社内標準を公開。
- PEP 8(Python):Python公式スタイル。
- Airbnb JavaScript Style Guide:JS分野のデファクト。
- Effective Java:Joshua Blochの設計指針。
メモリ管理の安全性
本問の論点は防御的プログラミングの典型。
- C:malloc 戻り値の NULL チェック必須。
- C++:`new` は標準では std::bad_alloc 例外。`new(std::nothrow)` で NULL 返却。スマートポインタ(unique_ptr、shared_ptr)でメモリ漏れ対策。RAII(Resource Acquisition Is Initialization)が定石。
- Java/C#:GC管理だが OutOfMemoryError 例外を考慮。
- Rust:所有権システムでコンパイル時にメモリ安全性を保証、`Result<T, E>` で失敗ハンドリングを型レベル強制。
- Go:GC管理だが panic / recover 機構あり。
エラー処理パターン
- 戻り値検査:C系の伝統的方法。
- 例外:C++/Java/C#/Python。try-catch でハンドリング。
- Optional / Result 型:Rust、Haskell、Scala、Swift。エラーを型で表現。
- エラーコード列挙:Go の `error` インタフェース。
ループ変数の数値型
- 整数型推奨:浮動小数点(float, double)は二進浮動小数点表現の誤差で 0.1×10 ≠ 1.0 のような問題を引き起こす。
- for (double f=0; f<1; f+=0.1) は反復回数が不定になる古典的バグ。
- 整数倍した値で制御 または `BigDecimal`(Java)等の十進演算ライブラリ使用。
静的解析と継続的品質管理
- 静的解析ツール:Coverity、SonarQube、PMD、ESLint、Pylint、clippy(Rust)。
- CI/CD組込み:プルリクエスト時に自動レビュー、品質ゲート。
- コードカバレッジ:JaCoCo、Istanbul、coverage.py。
- コードフォーマッタ:Prettier、Black、gofmt、rustfmt。チーム間の体裁統一を自動化。
試験での位置づけ
FE「ソフトウェア開発/品質管理」分野で頻出。応用情報・PM・SAでは品質特性(ISO/IEC 25010)、信頼性向上技法、フォールトトレラント設計まで踏み込む。
選択肢の発展補足
aの変数使い回しは古典的にはレジスタ節約のため許容されたが、現代のコンパイラ最適化では無意味で、可読性低下のみが残る。dのメモリ確保失敗は組込み・サーバ系で特に重要。OOM Killer(Linux)はメモリ枯渇時にプロセスを強制終了する仕組みで、想定外の挙動の原因になる。メモリプール事前確保で実行時失敗を回避する手法も組込み系で常套。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成30年度 春期 問7/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。