未定義の動作とは、その動作が規格上未定義の、異常なプログラムの動作のこと。未定義の動作には0除算時の動作等があります。その未定義の動作を列挙してみます。
未定義の動作とは、簡単にいうと異常なプログラムの動作のことであり、その動作が規格上定義されていないもののことです。例えば、整数演算のオーバフローに対する動作や0除算時の動作があります。「未定義の動作」は、C言語の標準規格であるJIS X 3010:2003(ISO/IEC 9899:1999)で次のように記述されています。「可搬性がない若しくは正しくないプログラム構成要素を使用したときの動作,又は正しくないデータを使用したときの動作であり,この規格が何ら要求を課さないもの。未定義の動作に対して,その状況を無視して予測不可能な結果を返してもよい。翻訳時又はプログラム実行時に,文書化された,環境に特有な方法で処理してもよい(診断メッセージの発行を伴っても伴わなくてもよい。)。さらに(診断メッセージを出力し)翻訳又は実行を中断してもよい。」
未定義の動作は、コンパイル時にエラーとなることもありますが、コンパイル時にも、実行時にも異常を検出せず、予測不能な結果を生じることもあります。最悪の場合、異常終了を引き起こします。開発者は、未定義の動作に依存するプログラムを書かないように細心の注意が必要です。MISRA-C:2012ではRule 1.3「未定義の動作またはクリティカルな未規定の動作の発生があってはならない」で注意を促しています。また、CERT C セキュアコーディングスタンダードには、MSC15-C「未定義の動作に依存しない」というレコメンデーションがあります。
未定義の動作にはどのようなものがあるのでしょうか。C言語の標準規格であるJIS X 3010:2003(ISO/IEC 9899:1999)の「附属書J 可搬性」を参考に未定義の動作を列挙してみましょう。