問題タブ [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.

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

c - C の未指定、未定義、および実装定義の動作 WIKI

SO にはこの主題に関するリンクがたくさんありますが、何かが欠けていると思います:未指定の動作(UsB)、未定義の動作(UB)、および実装定義の動作(IDB ) の違いを平易な言葉で明確に説明します。 )ユースケースと例の詳細かつ簡単な説明。

注:この WIKI では簡潔にするためにUSBの頭字語を作成しましたが、他の場所で使用されるとは思わないでください。

これは他の投稿と重複しているように見えるかもしれませんが (より近いものはこれです)、誰かがこれを重複としてマークする前に、私が既に見つけたすべての資料の問題点を検討してください (そして、私は作成するつもりです)この投稿のコミュニティ WIKI):

  • 散らばった例が多すぎます。もちろん、例は悪くはありませんが、目前の問題にうまく適合する例を見つけることができない場合があるため、(特に初心者にとって) 混乱を招く可能性があります。

  • 多くの場合、例はほとんど説明のないコードのみです。このようなデリケートな問題については、特に (相対的な) 初心者にとっては、よりトップダウンのアプローチの方が優れている可能性があります。まず、明確で単純な説明と抽象的な (ただし、法律論的ではない) 説明、次に いくつかの簡単な例と、それらが何らかの動作を引き起こす理由の説明を示します。 .

  • 一部の投稿では、C と C++ の例が混在していることがよくあります。C と C++ は、UsB、UB、および IDB と見なされるものと一致しない場合があるため、両方の言語に精通していない人にとっては、例が誤解を招く可能性があります。

  • USB、UB、および IDB の定義が示されている場合、通常は標準の単純な引用であり、初心者にとっては不明確または難しすぎる場合があります。

  • 規格の引用が部分的な場合もあります。多くの投稿は、当面の問題に役立つ部分のみの標準を引用しています。これは良いことですが、一般性に欠けています。さらに、標準の引用には説明が伴わないことがよくあります (初心者には悪い)。

私自身はこのテーマの専門家ではないので、コミュニティ WIKI を作成して、興味のある人なら誰でも回答に貢献して改善できるようにします。

構造化された初心者向けの WIKIを作成するという私の目的を台無しにしないために、WIKI を編集する際にポスターがいくつかの簡単なガイドラインに従うことを望みます。

  • ユースケースを分類します。該当する場合は、既存のカテゴリの下にサンプル/コードを配置してみてください。そうでない場合は、新しいカテゴリを作成してください。

  • まずは平易な説明。最初に簡単な言葉で説明します (もちろん、単純化しすぎないでください - 品質が第一です!) 例またはあなたが言おうとしている点を説明してください。次に、コード サンプルまたは引用を入れます。

  • 基準を参照して引用します。さまざまな標準のスニペットを投稿しないでください。ただし、明確な参照 (例: C99 WG14/N... セクション 1.4.7、パラグラフ ...)提供し、可能であれば関連するリソースへのリンクを投稿してください。

  • 無料のオンライン リソースを優先します。書籍や自由に利用できないリソースを引用したい場合は問題ありませんが (WIKI の品質を向上させる可能性があります)、無料のリソースへのリンクもいくつか追加してみてください。これは、特に ISO 規格にとって非常に重要です。公式の標準へのリンクを追加することは大歓迎ですが、自由に入手できるドラフトへの同等のリンクも追加してみてください。また、ドラフトへのリンクを公式規格への参照に置き換えず、それらに追加してください。一部の大学の一部のコンピューター サイエンス学部でさえ、ISO 標準のコピーを持っていません。

  • 本当に必要でない限り、コードを投稿しないでください。平易な英語のみを使用した説明がぎこちない、または不明確な場合にのみ、コードを投稿してください。コード サンプルをワンライナーに限定するようにしてください。代わりに、他の SO Q&A へのリンクを投稿してください。

  • C++ の例を投稿しないでください。これをCの一種の FAQ にしたいと思います(ただし、誰かが C++ のツインスレッドを開始したいのであれば、それは素晴らしいことです)。C++ との関連する違いは歓迎されますが、補足としてのみです。つまり、C のケースを徹底的に説明した後、C プログラマーが C++ に切り替えるときに役立つのであれば、C++ に関するいくつかのステートメントを追加できます。通常、 「(この場合、C++ の動作は異なります)」のような簡単なメモと関連するリンクで十分です。

私は SO にかなり慣れていないので、この方法で Q&A を開始することで規則に違反していないことを願っています。この場合は申し訳ありません。モッズは私にそれについて知らせてくれることを歓迎します。

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

c++ - メモリに関連する cuda の不可解な動作

だから基本的に私は私のC++コード(正しく動作している)を取り、それをcudaに書き直しました(私はcudaの経験がありません)。コードの一部 (solve() メソッド) が正しく機能しておらず、その理由がよくわかりません。

だから私の質問は、cudaMemcpy 中の「unspecified launch failure」エラーを正確に意味するものと、なぜそれが私のコードで起こっているのかということです。

2 番目の質問は、変数 backup_ans と ans が同じものを計算するときに異なるのはなぜですか?

solve() メソッドを除くすべてのコードは意図したとおりに機能します。solve() メソッドはでたらめを計算するだけで (backup_ans と ans が異なるため)、最後の 2 つの cudaMemcpy で「unspecified launch failure」エラーも表示されます。solve<<<1,1>>>(...) を実行すると、

ans: 134816642 backup_ans 432501552

しかし、solve<<<400,32>>>(...) を実行すると、

ans: 134816642 backup_ans 0 (正解は 0 のはずです)

すべての状況で、backup_ans=ans=0 を計算する必要があります

私が間違っていることについてのアドバイスは役に立ちます。

primes.bin を生成するためのコード

PS: nvcc -arch compute_11 でコンパイルしています

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

c++ - 動作が特定されていないものを実行/使用してもよいのはいつですか?

C++ では、適切に定義されたものと定義されていないものの中間にあるものがあります。具体的には、実装定義および未指定と呼ばれます。今、私は特定されていないものに興味があります。

そのような機能を使用してもよい場合と、使用を避けるべき場合はいつですか? 正しいコードの一部である不特定の動作の良い例はありますか? ソフトウェアを作成するときに、それが最善の選択であるとすれば、それはいつですか?

Matt McNabb によって提供された定義:

  • 未定義 - 何でも起こり得る

  • 実装定義 - 有限数の結果が可能であり、コンパイラのドキュメントには何が起こるかを記載する必要があります

  • 未指定- 有限数の結果が可能です -- 通常、規格は可能な結果のセットを記述します

  • 明確に定義されている - 上記のいずれでもない

  • 整形式プログラム - エラーなしでコンパイルされるプログラム (未定義の動作を示す可能性があります)

フォローアップの質問:

緩和されたアトミックは未指定または明確に定義されたものとしてカウントされますか?

異なる視点から同じ考えについて話している質問の重複としてマークされています。同じとマークされた質問は、不特定の動作の定義について述べていますが、ここでは、それをいつどのように使用するかについての質問です。

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

c++ - ムーブ セマンティクスと関数の順序評価

次のものがあるとします。

「関数パラメーターの指定されていない順序」に関する C++ の規則を正しく理解していれば、このコードは安全ではありません。のコンストラクターへの 2 番目の引数がB最初に move コンストラクターを使用して構築されている場合、a現在は a が含まれてnullptrおり、式a->xは未定義の動作をトリガーします (segfault の可能性があります)。最初の引数が最初に構築されている場合、すべてが意図したとおりに機能します。

これが通常の関数呼び出しである場合は、一時的なものを作成できます。

しかし、クラスの初期化リストでは、一時変数を自由に作成できません。

を変更できないとBします。上記を達成する方法はありますか? つまりunique_ptr、一時的なものを作成せずに、同じ関数呼び出し式で a を逆参照して移動しますか?

のコンストラクタを変更できてもB、 などの新しいメソッドを追加できないとしsetX(int)たら? それは役に立ちますか?

ありがとうございました

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

c++ - C++ cout 副作用シーケンス

次のコードを想定します。

1およびとしてマークされた行を実行2し、ideone でコンパイルすると同じことが行われ、次のように出力されます。

私の見解では、関数の引数が解決される順序が指定されていないため、ここで観察される動作は指定されていません。

これはインタビューでの質問で、上記のシーケンス (代替なし) を印刷するのが正解のはずでしたが、本当に正しいのでしょうか?

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

c - 同じ代入で変数を変更する関数で変数を代入する C での評価の順序

率直に申し上げると、これは指導が必要な宿題に関連しています。コードなどは必要ありませんが、これは私を夢中にさせているので、明確にする必要があります。私は本の中で質問さえしていません。

次のコードがあります。

実行すると、「aの値は20」、「右側の関数呼び出しで40」、「左側の関数呼び出しで40」が得られます。

私が混乱しているのは、直前に非常によく似た質問があったことです

そして、答えは sum1 の場合は 46、sum2 の場合は 48 になります。これは、私の頭では、codepad.org のコンパイラで左から右への評価で意味があります。しかし、Pelles C コンパイラでは 48 になります。最初の問題のコードがほとんど同じように配置されていることがわかります。

私はこのリンクを見つけました:この矛盾を説明しているように見えるCで呼び出す関数の前のパラメーター評価順序ですが、私の考え方から外れていないことを確認したいと思います。それで、それはコンパイラーに依存し、コンパイラーが最も効率的であると感じるものに依存していると言っても過言ではありませんか?

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

c++ - 「The C++ Programming Language」第 4 版セクション 36.3.6 のこのコードは、明確に定義された動作をしていますか?

Bjarne Stroustrup のThe C++ Programming Language 4th edition セクション36.3.6 STL-like Operationsでは、チェーンの例として次のコードが使用されています。

assert は ( see it live ) と ( see it live ) で失敗しますがgccClangVisual Studio使用する失敗しません( see it live )。

異なる結果が得られるのはなぜですか? これらのコンパイラのいずれかが連鎖式を正しく評価していないか、またはこのコードがなんらかの形式の未指定または未定義の動作を示していますか?

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

c++ - 標準ライブラリのヘッダーに任意のヘッダーが含まれているかどうかは不明ですか?

C++ 標準ライブラリのどのヘッダーが別のヘッダーを含むことが保証されているかという主張があります。:

C++ 標準ライブラリ ヘッダーは、不特定の方法で相互にインクルードする可能性があるため、通常、プログラマは 1 つのヘッダーが別のヘッダーを含むことに依存するべきではありません。[...]

実際には、この傾向があります。たとえば、<iostream>を含めることができますが、明示的<string>に含める必要がある場合もあります。<string>ただし、N4140 のどこに該当するかはわかりません。私は調べました:

  • §2.9 [lex.header]
  • §17.6.1.2 [ヘッダー]
  • §17.6.2.2 [using.headers]
  • §17.6.4.4 [alt.headers]
  • §17.6.5.2 [res.on.headers]

私が見つけることができる最も近いものは、[using.headers] からのものです。

2 翻訳単位には、任意の順序でライブラリ ヘッダーを含めることができます (条項 2)。<cassert>それぞれを複数回含めることができますが、一度だけ含めることと同じ効果が<assert.h>あります178

しかし、これは標準ライブラリではなく、C++ プログラムに当てはまるようです。

[using.overview]/1 このセクションでは、C++ プログラムが C++ 標準ライブラリの機能にアクセスする方法について説明します。[...]

[res.on.headers] と同様に:

1 C++ ヘッダーには、他の C++ ヘッダーが含まれる場合があります。C++ ヘッダーは、その概要に表示される宣言と定義を提供する必要があります。他の C++ ヘッダーを含むものとして概要に示されている C++ ヘッダーは、それらの他のヘッダーの概要に表示される宣言と定義を提供する必要があります。

キーは最初の文だと思いますが、それがunspecified behaviorだと明示的に言っていません。これは特定されていない動作であるとどこかで述べていますか、それとも単に暗示されていますか?