問題タブ [unspecified-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.
c++ - このコードは未定義の動作を生成しますか、それとも単に未指定の動作ですか?
次のように、2 つのコンパイル ユニットがあるとします。
VC2010で試してみると、初期化value1
さvalue2
れて最初にゼロになります。両方ともvalue1
動的value2
に初期化されておらず、デフォルトの初期化は適用されませんか?
ありがとう、
c++ - 空の基底クラスは派生クラスのレイアウトに影響を与えますか?
C++ 標準 (ドラフト n3242 から引用) では、サブオブジェクト [intro.object] について次のように述べています。
オブジェクトがビットフィールドまたはサイズがゼロの基本クラスのサブオブジェクトでない限り、そのオブジェクトのアドレスは、それが占有する最初のバイトのアドレスです。サイズがゼロのビットフィールドでも基本クラスのサブオブジェクトでもない 2 つの別個のオブジェクトは、別個のアドレスを持つ必要があります。
ここで、次のスニペットがあるとします。
gcc が出力され2
、Visual C++ 2010 が出力されると思います1
。gcc は、型が異なるオブジェクトを表す場合、型のストレージに別名を付けることはできないことを意味する標準を採用していると思われます。そして、MSVC は、1 つのサブオブジェクトのサイズがゼロの場合、やりたいことが何でもできるという標準を採用していると思います。
これは不特定の動作ですか?
c - CUDA: char 配列をホストからデバイスにコピーした後、「スタック オーバーフローまたはブレークポイント ヒット」および不明な起動失敗エラーが発生する
メイン プログラムに大きな char 配列があり、それをチャンクでデバイス メモリにコピーします。プログラムで約 500,000 のスレッドを実行し、各スレッドは 2000 文字にアクセスします。したがって、コードを使用して一度に 500,000 * 2000 = 1GB バイトを転送します
私のカーネルでは、3 つの共有配列も定義しています
そしてそれらを初期化します
コメントされた 2 行でプログラムを実行すると、カーネルが奇妙な値を返し、char 配列の 2 番目のチャンクをコピーするとエラーが発生します。
CUDA エラー: 不明な起動エラー
上記のコードの行のコメントを外すと、すべて正常に動作します。1GB ではなく 100MB など、配列の小さなチャンクをコピーすると、上記と同じエラーが発生する 6 番目のチャンクに到達するまで正常に動作します。
これは非常に奇妙な動作であり、なぜこれが起こっているのかを理解したいと思います。これを引き起こしているバグはどこかにありますか?小さなチャンク (100MB など) を転送し、他のチャンクを無視すると、プログラムは正常に動作するため、特定するのは困難です。共有変数に関連する行のコメントを外したり、共有変数を定数に変更したりしても、問題なく動作します。どんな助けでも大歓迎です。ありがとう!
編集: これが私のカーネルです。要約すると、2 つの文字列の類似性スコアを、0 からそれらの長さまでのすべての i の i 番目の文字を比較することによって計算しています。以下のコードは、 の直後の行のコメントを解除しない限り、上記のエラーを生成します if(threadIdx.x == 0) {
。または、以下の共有配列を定数配列に置き換えると、正常に動作します。
c - C で関数を呼び出すときのシーケンス ポイントと未定義/未指定の動作
C のシーケンス ポイントについての理解を深めようとしています。何かを確認したかっただけです。g
現在、(1) は未定義であるのに対し、(2) は単に指定されていないと考えています。(2) では、 andの引数を評価した後にシーケンス ポイントが存在することに基づいています (したがって、シーケンス ポイント間で 2 回h
変更することはありません)。i
ですが、 の引数の評価順序f
はまだ指定されていません。私の理解は正しいですか?
編集:
ここでの重要なポイントは、コンパイラがどちらかの前に両方のインクリメントを自由に実行できるかどうか、g
またはh
呼び出されるかどうかです.
c++ - このconst指定子の動作が指定されていないのはなぜですか?
私はオープンソースプログラムを維持していますが、ユーザーの1人が、これまで使用したことのないでコンパイルされないと報告しclang
ました。私が得ているエラーの1つは、*警告:関数型'junky_t'(別名'void(const int&、const int&)')の修飾子の動作が指定されていないことです。*。この問題を示す小さなプログラムを作成しました。
そして、これが私がコンパイルしようとすると何が起こるかです:
つまり、クラスdemo
には、多数のconst参照を受け取るシグニチャを持つ関数への関数ポインタがあります。const
クラス内のは、変更されdemo
ないようにする必要があります。junk
ただし、関数自体が考慮される可能性があるため、明らかにあいまいですが、そうconst
ではありません。これをgcc
またはでコンパイルするのに問題はありませんが、Macではllvm
コンパイルできません。clang
私は何をすべきか?
c - (x++, y) + (y++, x) は未定義または未指定ですか? 未指定の場合、何を計算できますか?
コンマ シーケンス演算子は、式にシーケンス ポイントを導入します。これは、以下のプログラムが未定義の動作を回避することを意味するかどうか疑問に思っています。
未定義の動作を回避する場合でも、未指定のままである可能性があります。つまり、いくつかの可能な値の 1 つを返します。C99 では しか計算できないと思いますが1
、実際には、さまざまなバージョンの GCC がこのプログラムを を返す実行可能ファイルにコンパイルします2
。Clang は を返す実行可能ファイルを生成します。これ1
は私の直感と一致しているようです。
最後に、これはC11で変更されたものですか?
c++ - 複合式の複数のオペランドが同じオブジェクトを変更する場合、それは未定義の動作ですか?
複合式の複数のオペランドが同じオブジェクトを変更する場合、それは未定義の動作であるとどこかで読んだことを漠然と覚えています。
このUBの例は以下のコードに示されていると思いますが、g ++、clang ++、およびVisual Studioでコンパイルしました。これらはすべて同じ値を出力し、異なるコンパイラーで予測できない値を生成することはできません。
この動作は未定義ですか、それとも実際には未定義ではないはずのUBの説明を思いついたのでしょうか。
誰かがこのUBの例を投稿してくれて、C++標準のどこにUBだと言っているのかを教えてくれたらありがたいです。
c++ - オブジェクトを返す関数呼び出しとそのオブジェクトのメソッド呼び出しの間にシーケンスポイントはありますか?
私が書く場合、私は評価の前にf(x)->g(args, ...)
シーケンスポイントに頼ることができますか?私は両方の方法で議論を見ることができます:f(x)
args, ...
- §1.9.17「関数を呼び出す場合(関数がインラインであるかどうかに関係なく)、すべての関数の引数(存在する場合)の評価後、関数本体の式またはステートメントの実行前に実行されるシーケンスポイントがあります。戻り値のコピー後、関数外の式の実行前にもシーケンスポイントがあります。」
- 一方、オブジェクトポインタは、
this
私が書いたかのように暗黙的に非表示の引数g(f(x), args, ...)
であり、引数のようなものであり、したがって指定されていないことを示唆しています。
->
演算子は通常の二項演算子ではありません。これは、私が書いた場合のように、以前は明らかに評価できg(...)
ないためです。私はそれについての特定の声明を見つけることができないことに驚いています。f(x)
f(x) + g(...)
c++ - 新しいマップ要素にインデックスを付けて、それを読み取る何かをそれに割り当てて、未定義の動作をしているのか、それとも単に未指定なのか?
この質問に答えた後、問題のコードが未定義の動作であるかどうかについて長い議論がありました。コードは次のとおりです。
まず第一に、これが少なくとも特定されていないことは確立されていました。結果は、割り当てのどちら側が最初に評価されるかによって異なります。私の回答では、結果として得られた 4 つのケースのそれぞれについて、どちらの側が最初に評価されるか、および要素がこれより前に存在するかどうかの要因を追跡しました。
同様に出てきた短い形式がありました:
私はそれがもっとこのようなものだと主張しました:
最終的に、私にとってうまくいくと思われる例を見つけました:
元に戻って、簡単に理解できるように、関連する関数呼び出しに分割しました。
word_count["a"]
が存在しない場合は、間に順序付けなしで 2 回割り当てられると主張されました。私が真実だと思っていた2つのことが実際にあった場合、私は個人的にそれがどのように起こるかわかりませんでした:
サイドが評価のために選ばれるとき、反対側が開始する前に、サイド全体が評価されなければなりません。
word_count["a"] = 1 などの構成要素は、要素が挿入されてから割り当てられた場合でも、明確に定義された動作を示します。
これらの 2 つのステートメントは本当ですか? 最終的に、それは実際には未定義の動作ですか? もしそうなら、なぜ 2 番目のステートメントが機能するのですか (機能すると仮定して)? 2 番目が false の場合、myMap[i]++;
世界中のすべての s は形式が正しくないと思います。
役立つリンク:未定義の動作とシーケンス ポイント
c++ - C ++でインライン関数を使用した未指定の出力
C++ の内部リンケージと外部リンケージを理解するためにコードをいじっていました。リンクされている順序によって出力が異なるように見えるコードを思いつきました。
test1.cpp
test2.cpp
ドライバー.cpp
出力 1 :-
上記の出力では、コンパイラは test1.cpp で定義された c() を考慮しています。
出力 2:- リンク中に test1.o と test2.o のシーケンスを変更します。
上記の出力では、コンパイラは test2.cpp で定義された c() を考慮しています。
コードに小さな変更を加えたとき、私は当惑しました。次のとおりです
。 cpp]
リンク中に次のエラーが発生します:-
2) ファイルのいずれか、つまり test1.cpp または test2.cpp で c() を呼び出すと、リンカー エラーが発生しません。
誰でもこの動作を理解するのを手伝ってくれませんか。
前もって感謝します。