未定義動作
つまり仕様に準拠したプログラムでは*ptrx > 60の条件チェックは常にfalseになるため、コンパイラはwhileループを直ちに除去することができる。さらに、戻り値のzは使用されずfoo()関数は副作用を持たないため、コンパイラはrun_tasks()を最適化して、即時に終了する空の関数にすることができる。foo()が既にコンパイルされた別のオブジェクトファイルで定義されている場合、このようにwhileループが消えることは予測することが難しいかもしれない。
符号付き整数オーバーフローを未定義動作とすることのもう1つの利点は、ソースコード内の変数のサイズよりも大きいレジスタに変数の値を格納・操作できることである。たとえば、ソースコードで指定されている変数の型がレジスタのサイズよりも小さい場合(64ビットマシンで32ビット整数型を利用する場合など)、コンパイラは(定義された)動作を変更することなく、生成するマシンコード内の変数としてレジスタを安全に使用できる。もしプログラムが32ビット整数型のオーバーフローの動作に依存している場合、ほとんどのマシン命令のオーバーフロー動作はレジスタサイズに依存するため、コンパイラは64ビットマシン用にコンパイルするときに追加のロジックを挿入する必要がある。
一部のプログラミング言語では、プログラムの実行中に未定義動作が発生しないならば、ユーザーから見える副作用が同じである限り、ソースコードと異なるプログラムの動作や制御フローを持つことを許容している。この意味において未定義動作とは、仕様においてプログラムが満たしてはならない一連の条件を指すといえる。
C言語の初期のバージョンにおいて未定義動作を設けることは、さまざまなマシンに対応したパフォーマンスの高いコンパイラを作成するために有利だった。特定の構成をマシン固有の機能にマッピングでき、コンパイラは言語によって課せられたセマンティクスに副作用が一致するよう、ランタイム用に追加のコードを生成する必要がなかった。これにより、ユーザーは特定のコンパイラとそれがサポートするプラットフォームさえ知っていればプログラムのソースコードを書くことが可能となった。
しかしながら、プラットフォームの標準化が進むにつれ、特に新しいバージョンのCでは、これは大きな利点ではなくなっていった。現在のプログラムにおける未定義動作は、配列の範囲外アクセスなど、コード内の明確なバグである可能性が高い。定義上、ランタイムシステムは未定義動作が発生しないと想定するため、このような無効な条件をチェックする必要がない。コンパイラからすると、これにより様々なプログラム変換をすることができるようになったり、プログラムの正当性の証明を単純化できるということでもある。これにより、さまざまな種類の最適化が可能になるが、逆に言えばプログラムの実行状態がそのような未定義の条件を満たしてしまった場合、誤動作につながってしまうこともある。