C言語の未定義

C言語の未定義はわりとネガティブな意味で使われることが多い。例えば「未定義とは本当にどんなことがお こっても不思議ではないことを意味する。」(C FAQ 11.33)、「鼻から悪魔が飛び出しても仕様に反しない」(comp.lang.c?)など


しかし効果的に最適化が行なえるというメリットもある。

例えば、xがintのとき、x + 1 > x は必ず成立するとみなすことができる。(つまりコンパイラは演算する命令を出力せず単にtrueと扱うことができる)(*1)


x + 1 > x は一見すると当たり前のようだが、ここで気にしているのはxがINT_MAXのケースである。このとき x + 1 はオーバーフローしてINT_MINになり、x + 1 < x となることがあるのかもしれない。もしそうなら常にtrueとするのは誤りである。
しかし、INT_MAX + 1 はC言語の仕様により未定義なのでコンパイラはこのケースを気にする必要がない。常にtrueとみなすことができる。(最適化できる)


未定義を最適化に積極的に利用する例は以下参照;

本の虫: Old New Thing: 未定義動作はタイムトラベルを引き起こす(他にもいろいろあるけど、タイムトラベルが一番ぶっ飛んでる)
https://cpplover.blogspot.jp/2014/06/old-new-thing.html

C言語分かってなかった (I Do Not Know C) - Qiita
http://qiita.com/yohhoy/items/960ee7a7b502e5c764b4


(*1)
ただし、最適化で x + 1 > x が消えることがプログラマの期待通りかは微妙。x + 1 > x をわざと書いたのならそれはおそらくINT_MAXオーバーフローを検知しようとしたように見える。