何かを「未定義の動作」として定義することの要点は、コンパイラでこの状況を検出する必要がないようにすることです。そのように定義されているため、さまざまなプラットフォームとアーキテクチャ用にコンパイラを構築でき、ハードウェアとソフトウェアに「未定義の動作を検出するためだけに」特定の機能を持たせる必要がありません。実際のメモリに書き込んでいるかどうかを検出できないメモリ サブシステムがあるとします。コンパイラまたはランタイム システムは、書き込んだことをどのように検出しますか?somepointer = rand(); *somepointer = 42;
いくつかの状況を検出できます。しかし、すべてが検出されることを要求すると、生活が非常に困難になります。
元の質問の編集を考えると、これをCで達成するのがもっともらしいとはまだ思いません.ほとんど何でも自由に行うことができます(ほとんど何でもへのポインタを作成し、これらのポインタは変換、インデックス付け、再計算、およびすべて他の方法)、あらゆる種類の未定義の動作を引き起こす可能性があります。ここに C のすべての未定義の動作のリストがあります- ファイルの最後の文字としてのバックスラッシュ (コンパイラ エラーを引き起こす可能性がありますが、1 つとして定義されていません) から「比較関数bsearch または qsort 関数によって呼び出されると、一貫性のない順序付け値が返されます。」
bsearch または qsort に渡された関数が一貫して値を並べ替えていることを確認するために、コンパイラをどのように作成しますか? もちろん、比較関数に渡されるデータが整数などの単純な型であればそれほど難しくはありませんが、データ型が複雑な型の場合は
struct {
char name[20];
char street[20];
int age;
char post_code[10];
};
プログラマーは、名前の昇順、通りの昇順、年齢の降順、郵便番号の昇順に基づいてデータを並べ替えることにしましたか? それがあなたが望むものであるが、どういうわけかコードが台無しになり、ポストコード比較が一貫性のない結果を返す場合、事態はうまくいかないでしょうが、そのケースを正式に検査することは非常に困難です. 同様に曖昧で複雑なものは他にもたくさんあります。確かに、あなたのコードは名前や住所などをソートしないかもしれませんが、おそらく誰かがいつかそのようなものを書くでしょう。