エンベデッドシステムスペシャリスト暗記無料で始める

未定義動作とは?みていぎどうさ

未定義動作とは、C言語の規格が結果を一切定めていない操作。符号付き整数のオーバフロー、配列範囲外への書込み、初期化前の変数の読出しなどが該当し、処理系は何をしてもよい。最適化の強度やコンパイラの版で挙動が変わる原因になるため、コーディング規約が名指しで禁止する対象になっている。

最終更新:2026-10-06

試験情報

エンベデッドシステムスペシャリスト試験の過去問では1問の解説で触れられています。

エンベデッドシステムスペシャリスト試験の頻出用語/午前II

この語が出る過去問を解く →

背景

C は多様なプロセッサへ移植できることを優先し、実行時の検査を言語仕様に持ち込まなかった。すべての操作へ意味を与えるには検査コードを挿すか特定ハードの前提を置くしかなく、その両方を避けるために「規定しない」という区分が置かれた。この空白がそのままコンパイラの最適化の自由度になり、規格が保証しない前提に依存したコードを削ってよい根拠になっている。

具体例

MISRA C は未定義動作につながる書き方を規則として禁止し、静的解析ツールが違反を検出する。典型は符号付き int のあふれを前提にした範囲検査で、コンパイラが「あふれは起きない」と仮定して条件式ごと消してしまうため、最適化を -O0 から -O2 へ上げた途端に検査が効かなくなる。

試験での引っ掛け

処理系定義動作(右シフトの符号拡張のように処理系が決めて文書化する)と未規定動作(評価順序のように候補の中から決まる)は別区分で、前者は処理系の文書を根拠に依存してよい。デバッグ版で期待どおり動いたとしても、それは定義された動作になった証拠にはならない。

関連用語

出た過去問

解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。

この語が出る過去問を解く →

試験での特徴
  • 1問の解説で触れられる
  • 分野:午前II
  • 処理系定義動作(右シフトの符号拡張のように処理系が決めて文書化する)と未規定動作(評価順序のように候補の中から決まる)は別区分で、前者は処理系の文書を根拠に依存してよい。