web-dev-qa-db-ja.com

「IB」と「UB」の正確な意味は何ですか?

特にC++のコンテキストでは、「IB」と「UB」という用語が何度も使用されています。私はそれらをグーグルで試しましたが、どうやらそれらの2文字の組み合わせは多くの用途を見ています。 :P

だから、私はあなたに尋ねます...彼らが悪いことであるかのように言われたとき、彼らは何を意味しますか?

102
cHao

IB:Implementation-defined Behaviour。この規格では、正確な動作を定義するために特定のコンパイラ/プラットフォームに任せていますが、定義する必要があります。

実装定義の動作を使用すると便利ですが、コードの移植性が低下します。

B:Undefined Behaviour。この規格では、未定義の動作を呼び出すプログラムの動作を指定していません。理論的には悪魔が鼻から飛び出す可能性があるため、「鼻の悪魔」とも呼ばれます。

未定義の動作を使用することは、ほとんど常に悪い考えです。動作するように見える場合でも、環境、コンパイラ、またはプラットフォームを変更すると、コードがランダムに破損する可能性があります。

128
Thomas

実装定義の動作と未定義の動作

C++標準は、さまざまな構成要素の効果について非常に具体的であり、特に trouble のこれらのカテゴリに常に注意する必要があります。

  • 未定義の動作とは、保証がまったくないことを意味します。コードが機能するか、ハードドライブに火をつけるか、 悪魔が鼻を飛び出すようにする 。 C++言語に関する限り、絶対に何でも起こります。実際には、これは一般的に、回復不可能なバグがあることを意味します。これが発生した場合、アプリケーションについて anything を本当に信頼することはできません(この未定義の動作の影響の1つは、残りのユーザーが使用するメモリを台無しにしてしまったためかもしれません)アプリ)。一貫している必要はないため、プログラムを2回実行すると、異なる結果が得られる場合があります。それは月の満ち欠け、あなたが着ているシャツの色、または絶対に何かに依存するかもしれません。

  • 不特定の動作とは、プログラムが正常で一貫性のある何かを行う必要があることを意味しますが、これを document にする必要はありません。

  • 実装定義の動作は未指定に似ていますが、コンパイラの作成者が文書化する必要もあります。この例は、reinterpret_castの結果です。 通常、アドレスを変更することなく、単にポインタのタイプを変更しますが、マッピングは実際には実装定義であるため、コンパイラは could この選択を文書化する限り、完全に異なるアドレスにマップします。別の例は、intのサイズです。 C++標準では、2バイト、4バイト、または8バイトのいずれでもかまいませんが、 must はコンパイラによって文書化される必要があります

しかし、これらすべてに共通するのは、それらを避けるのが最善だということです。可能な場合は、C++標準自体で100%指定された動作を維持します。そうすれば、移植性が保証されます。

多くの場合、実装定義の動作にも依存する必要があります。避けられないかもしれませんが、それにも注意を払う必要があり、異なるコンパイラ間で変更される可能性のあるものに依存していることに注意してください。

一方、未定義の動作は、alwaysを避ける必要があります。一般に、プログラムが何らかの形で爆発することを想定してください。

17
jalf
  • IB:実装定義の動作です-コンパイラはそれが何をするかを文書化しなければなりません。 >>負の値に対する操作は一例です。

  • UB:未定義の振る舞い-コンパイラーは、単にクラッシュしたり、予測できない結果を与えたりすることを含め、何でもできます。 nullポインターの逆参照はこのカテゴリに該当しますが、配列オブジェクトの境界外にあるポインター演算などの微妙なものにも該当します。

別の関連用語は「不特定の動作」です。これは、定義済みの動作と未定義の動作の間の一種です。動作が指定されていない場合、コンパイラは標準に従って何かを実行する必要がありますが、標準が提供する正確な選択はコンパイラ次第であり、定義する必要はありません(一貫性さえありません)。部分式の評価の順序などは、このカテゴリに分類されます。コンパイラはこれらを好きな順序で実行でき、異なるビルドで、または同じビルドの異なる実行でも異なる方法で実行できます(可能性は低いが許可されています)。

8
Michael Burr

ショートバージョン:

実装定義の動作(IB):正しくプログラムされているが不確定*

未定義の動作(UB):不適切にプログラムされています(つまり、bug!)

*)言語標準に関する限り、「不確定」は、もちろん、固定プラットフォーム上で確定します。

4
Kerrek SB
4
missingfaktor