はじめに
C言語の規定されていない動作について調べたことを覚書として残しておく。
調べた結果
ISO/IEC 9899:1999(原文)、(和文)にて定義されていることを知る。
恥ずかしながら初めて見ました。(C言語を使って10年ぐらいしますが、、、)
◇ 処理系定義の動作
- 定義:「3.4.1 implementation-defined behavior」章
- 動作一覧:「Annex J」 J.3 章
- コンパイルができて、その動作に再現性がある。
◇ 文化圏固有動作
- 定義:「3.4.2 locale-specific behavior」章
- 動作一覧:「Annex J」 J.4 章
- コンパイルができて、その動作に再現性がある。
◇ 未定義の動作
- 定義:「3.4.3 undefined behavior」章
- 動作一覧:「Annex J」 J.2 章
- コンパイルはできないかもしれないし、その動作に再現性がないかもしれない。(何の保証もない)
◇ 未規定の動作
- 定義:「3.4.4 unspecified behavior」章
- 動作一覧:「Annex J」 J.1 章
- コンパイルはできるが、その動作に再現性はないかもしれない。
まとめ
上記のコードは環境依存のため移植性が低くなるため注意が必要。
特に「未定義の動作」と「未規定の動作」はバグのもとになるため避けたほうが良い。
開発する前にコンパイルのユーザーマニュアルを見る習慣をつける。