問題タブ [undefined-behavior]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
741 参照

objective-c - カテゴリを使用して、それ自体がスーパークラスのカテゴリにあるメソッドをオーバーライドできますか?

-myMethodのどの実装が呼び出されるかが定義されていますか?

Kochanは、Objective-Cのプログラミングで次のように述べています。

複数のカテゴリが同じクラスに対して同じ名前のメソッドを宣言している場合、呼び出されたときにどのメソッドが実行されるかは定義されていません。

しかし、このコンテキストでは、スーパークラスのカテゴリが同じクラスのカテゴリと見なされるかどうかはわかりません。

0 投票する
8 に答える
1608 参照

c - これは未定義のCの動作ですか?

私たちのクラスは、Cプログラミングの教授から次の質問を受けました。

コードが与えられます:

常にどのような出力が生成されますか?

ほとんどの学生は未定義の行動を言いました。なぜそうなのか誰かが私に理解するのを手伝ってもらえますか?

編集と回答に感謝しますが、私はまだ混乱しています。

0 投票する
3 に答える
328 参照

c++ - 間接参照によるポインタのセットの無効化

次のプログラムを検討してください。intへのポインタのセットを作成し、指定された整数の値でセットをソートするカスタムindrect_lessコンパレータを使用します。これが完了したら、ポイントされた整数の1つの値を変更します。次に、セットの順序がソートされなくなったことがわかります(セットは何かが変更されたことを認識していないためだと思います)。

(C ++ 0xループを気にしないでください、私はVS2010で実行しています)

1)未定義動作を呼び出しているのは正しいですか?行の後に全体の状態がmyset無効*a = 9;ですか?

2)これを消去してから再挿入する唯一の正しい方法はありaますか?

3)一度*a = 9;実行された後、明確に定義された動作で、セットをソートされた順序にリバランスする方法はありますか?

0 投票する
1 に答える
1085 参照

c - Cでの暗黙の宣言

Undefined Behaviour次のプログラムはCで呼び出しますか?

上記のプログラムには暗黙の宣言がありprintf()ますが、上記のコードは完全に標準に準拠していますか、それとも実装固有の動作がありますか?

0 投票する
6 に答える
104 参照

c++ - UB によって、複数のシングル スレッド アプリの実行によって異なる出力が生成される可能性はありますか?

次の条件を満たすコードが、同じ入力に対して実行ごとに異なる出力を生成する可能性はありますか?

  • コードはシングル スレッドですが、スレッド セーフなランタイム ライブラリにリンクしています。
  • rand() または time() またはそれらの仲間への明示的な呼び出しはありません。
  • いくつかのヒープ メモリ割り当てがあります。
  • 未定義の動作を引き起こす (バグのある) コードが含まれている可能性があります。
0 投票する
8 に答える
15845 参照

c++ - 「while(1);」を最適化する C++0xで

更新されました。以下を参照してください。

C ++ 0xを使用すると、コンパイラが次のスニペットの「Hello」を出力できることを聞いて読んだことがあります。

それは明らかにスレッドと最適化機能と関係があります。しかし、これは多くの人々を驚かせる可能性があるように私には思えます。

誰かがこれが許可するために必要だった理由の良い説明を持っていますか?参考までに、最新のC++0xドラフトは次のように述べています。6.5/5

forステートメントの場合のfor-init-statementの外側で、ループが発生します。

  • ライブラリI/O関数を呼び出さず、
  • 揮発性オブジェクトにアクセスまたは変更せず、
  • 同期操作(1.10)またはアトミック操作(29節)を実行しません

実装によって終了すると想定される場合があります。[注:これは、終了が証明できない場合でも、空のループの削除などのコンパイラー変換を可能にすることを目的としています。—エンドノート]

編集:

この洞察に満ちた記事は、その標準のテキストについて述べています

残念ながら、「未定義動作」という言葉は使用されていません。ただし、標準で「コンパイラはPを想定する可能性がある」と記載されている場合は常に、プロパティnot-Pを持つプログラムのセマンティクスが未定義であることを意味します。

それは正しいですか、コンパイラは上記のプログラムに対して「Bye」を出力することを許可されていますか?


ここにはさらに洞察に満ちたスレッドがあります。これは、上記のリンクされた記事を行ったGuyによって開始された、Cと同様の変更に関するものです。他の有用な事実の中で、それらはC ++ 0xにも適用されるように見える解決策を提示します(更新:これはn3225ではもう機能しません-以下を参照してください!)

コンパイラはそれを最適化することを許可されていないようです。なぜなら、それはループではなく、ジャンプだからです。別の男がC++0xとC201Xで提案された変更を要約します

ループを作成することにより、プログラマーは、ループが目に見える動作(I / Oの実行、揮発性オブジェクトへのアクセス、同期またはアトミック操作の実行)で何かを実行するか、 最終的に終了することを表明します。副作用のない無限ループを記述してその仮定に違反した場合、私はコンパイラーに嘘をつき、プログラムの動作は未定義になります。(運が良ければ、コンパイラーはそれについて警告するかもしれません。)この言語は、目に見える振る舞いなしに無限ループを表現する方法を提供していません(もはや提供していませんか?)。


2011年3月1日にn3225で更新:委員会はテキストを1.10 / 24に移動し、次のように述べます。

実装では、任意のスレッドが最終的に次のいずれかを実行すると想定する場合があります。

  • 終了、
  • ライブラリI/O関数を呼び出します。
  • 揮発性オブジェクトにアクセスまたは変更する、または
  • 同期操作またはアトミック操作を実行します。

gotoトリックはもう機能しません!

0 投票する
8 に答える
10729 参照

c - 「構造体ハック」は技術的に未定義の動作ですか?

私が質問しているのは、よく知られている「構造体の最後のメンバーの長さが可変である」というトリックです。これは次のようになります。

構造体がメモリに配置される方法により、必要以上のブロックに構造体をオーバーレイし、最後のメンバーを指定されたものよりも大きいかのように扱うことができ1 charます。

したがって、問題は次のとおりです。この手法は技術的に未定義の動作ですか?。そうだと思いますが、規格がこれについて何を言っているのか興味がありました。

PS:私はこれに対するC99のアプローチを知っています、私は答えが上記のトリックのバージョンに特に固執することを望みます。

0 投票する
6 に答える
3885 参照

c - 符号付き右シフト = 奇妙な結果?

私は誰かの宿題を手伝っていて、この奇妙な問題に遭遇しました。問題は、符号付き整数のバイトの順序を逆にする関数を作成することです (とにかく関数が指定された方法です)。これが私が思いついた解決策です:

この関数に渡す0xFF000000と、最初の代入は になり0xFFFFFFFFます。何が起こっているのかよくわかりませんが、署名付きと未署名の間の変換、またはそのようなものと関係があることは知っています。

追加ulすると正常に0xFF動作します。これは、強制的に署名なしに変換されてから、署名付きまたはその方向の何かに変換されるためだと思います。結果のコードも変更されます。指定子がないul場合は sar(算術右シフト) を使用しますが、符号なしでは意図したとおりに shr を使用します。

誰かが私のためにこれに光を当てることができれば、本当に感謝しています。私はこのことを知っているはずであり、知っていると思っていましたが、ここで何が起こっているのか本当にわかりません.

前もって感謝します!

0 投票する
5 に答える
724 参照

c - unsigned char a[4][5]です。a [1] [7]; 未定義動作?

C標準の未定義動作の例の1つは、(J.2)を読み取ります。

—指定された添え字でオブジェクトに明らかにアクセスできる場合でも、配列の添え字が範囲外です(宣言int a[4][5]が与えられた左辺値式a[1][7]のように)(6.5.6)

宣言がからint a[4][5]に変更された場合でもunsigned char a[4][5]、アクセスするa[1][7]と未定義の動作が発生しますか?私の意見ではそうではありませんが、反対する人から聞いたことがあるので、SOの専門家になる他の人がどう思うか見てみたいと思います。

私の推論:

  • 6.2.6.1段落4および6.5段落7の通常の解釈では、オブジェクトの表現asizeof (unsigned char [4][5])*CHAR_BITビットであり、オブジェクトとオーバーラップする型の配列としてアクセスできunsigned char [20]ます。

  • a[1]unsigned char [5]は左辺値として型を持ちますが、式で([]演算子のオペランドとして、または同等にの+演算子のオペランドとして*(a[1]+7))使用されると、型のポインターに減衰しますunsigned char *

  • の値は、の形式a[1]の「表現」のバイトへのポインタでもあります。このように解釈すると、に7を追加することが有効です。aunsigned char [20]a[1]

0 投票する
2 に答える
239 参照

c - Cプログラムの混乱

与えられたプログラムは適切に定義されていますか?