未定義動作とは?みていぎどうさ
未定義動作とは、C言語の規格が結果を一切定めていない操作。符号付き整数のオーバフロー、配列範囲外への書込み、初期化前の変数の読出しなどが該当し、処理系は何をしてもよい。最適化の強度やコンパイラの版で挙動が変わる原因になるため、コーディング規約が名指しで禁止する対象になっている。
最終更新:2026-10-06
この語が出る過去問を解く →背景
C は多様なプロセッサへ移植できることを優先し、実行時の検査を言語仕様に持ち込まなかった。すべての操作へ意味を与えるには検査コードを挿すか特定ハードの前提を置くしかなく、その両方を避けるために「規定しない」という区分が置かれた。この空白がそのままコンパイラの最適化の自由度になり、規格が保証しない前提に依存したコードを削ってよい根拠になっている。
具体例
MISRA C は未定義動作につながる書き方を規則として禁止し、静的解析ツールが違反を検出する。典型は符号付き int のあふれを前提にした範囲検査で、コンパイラが「あふれは起きない」と仮定して条件式ごと消してしまうため、最適化を -O0 から -O2 へ上げた途端に検査が効かなくなる。
試験での引っ掛け
処理系定義動作(右シフトの符号拡張のように処理系が決めて文書化する)と未規定動作(評価順序のように候補の中から決まる)は別区分で、前者は処理系の文書を根拠に依存してよい。デバッグ版で期待どおり動いたとしても、それは定義された動作になった証拠にはならない。
関連用語
出た過去問
出典:平成30年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問21(IPA)解説で登場
MISRA-Cの説明として、適切なものはどれか。
正解:車載システムの品質向上を目的に制定された、C言語実装法のガイドライン
要点:MISRA-Cは車載向けC言語コーディングのガイドライン
MISRA-Cは、英国の自動車業界団体MISRAが策定した、C言語を安全性が重要な組込みシステムで使うためのコーディングガイドラインである。処理系依存の動作や未定義動作を招きやすい書き方を禁止・制限するルール群からなり、静的解析ツールで適合を検査するのが一般的である。言語そのものではなく実装(記述)の指針である点が要点。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。