C ++の未定義の動作







C ++コードは構文的に有効ですが、その動作は標準で定義されていない状況は、ロシア語の文献では単に未定義の動作と呼ばれます。 標準自体には、そのような状況に対して、 未定義の動作未指定の動作実装 定義の動作という3つの用語があります 。 この短いメモでは、それらの違いを理解します。







実装定義の動作



この用語は、C ++コードが完全に有効であるが、その動作は実装(コンパイラやランタイムなど)に依存する状況を説明するために使用され、 この動作は文書化されています 。 たとえば、ポインターまたはint型のバイト単位のサイズは、特定の実装またはコンパイラーの設定に依存しますが、これはドキュメントで説明されており、このドキュメントを利用できます。







不特定の動作



この用語は、有効なC ++コードの動作が標準によって定義されておらず、実装に依存していることを意味します 。さらに、少なくとも公式には文書化されていません 。 例:関数の引数の値を計算する手順はコンパイラーによって決定されますが、その方法についての説明はどこにもありません。 標準では、これらはどこでも修正されていない動作機能であるため、それらに依存することはできません。 したがって、コードの動作はこれらの機能に依存するべきではありません。







未定義の動作



これは不確実性の最も危険なバリアントです。 標準では、完全に予測不可能な結果につながる可能性のある動作を記述するのに役立ちます。 最も顕著な例は、配列の境界にアクセスするか、解放されたオブジェクトへのポインターを逆参照することです。 最悪の部分は、プログラムをすぐに終了したり、エラーを発生させたりする必要がないことです。ただし、その動作に依存することはできません。







結論として、上記の用語はすべて、正常にコンパイルされる構文的に有効なコードを指していることをもう一度思い出します(ただし、コンパイラは、 未定義の動作の最も明らかなケースに対して警告を発行することがよくあります )。 標準の観点から無効なコードは、不正な形式のプログラムと呼ばれます








All Articles