問題タブ [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.
c++ - 不確定な値の読み取りは未定義の動作ですか?
質問に対する回答のコメントで質問が発生しました。intに型キャストされた場合、C / C ++ブール型は常に0または1であることが保証されていますか?
問題のコードは、値を初期化せずにの(ローカル)配列を割り当てbool
ます。
明らかに、の値b
は不確定です。
一部のコメント提供者は、例えば読書b[0]
は未定義の行動であると意見を述べました。これはC++標準のどこかに記載されていますか?私はまだ反対のことを確信しています:
コンストラクターがないため、明らかにストレージが割り当てられ、基本的なブール型の初期化が完了しています。したがって、初期化されていないポインタを逆参照したり、初期化されていない重要なオブジェクトに対してメソッド/キャスト演算子を呼び出したりすることとは確かに同じではありません。これらの特定のケースは、標準でカバーされているようです。
動作は実際にCでは定義されていません。Cで宣言された初期化されていない変数はどうなりますか?価値はありますか?一部の回答者は2つを混同しているようです。
最新のC++0xドラフトでは、不確定な値の定義、特にそのような値にアクセスしてプロセッサトラップをトリガーできる定義は見つかりません。確かに、Bjarne Stroustrupは、不確定な値が何であるかを確信していません:http: //zamanbakshifirst.blogspot.com/2007/02/c-indeterminate-value.html
c++ - 初期化されていないポインタの逆参照が未定義の動作であるとC++標準は正確にどこで言っていますか?
これまでのところ、次のように推測する方法が見つかりません。
未定義の動作です。
まず、5.3.1/1 には、*
に変換T*
されるindirection を意味することが記載されていT
ます。しかし、これはUBについては何も言いません。
次に、3.7.3.2/4 がよく引用され、null 以外のポインターで割り当て解除関数を使用するとポインターが無効になり、その後の無効なポインターの使用は UB であると述べられています。しかし、上記のコードでは、割り当て解除については何もありません。
上記のコードで UB をどのように推定できますか?
c++ - const_castによるこのconstの初期化には、未定義の動作がありますか?
私の小さなテストによると、このコードは機能します。しかし、それは未定義の振る舞いを持っていますか?const_castを使用してconstオブジェクトを変更すると、以前のテストで実行時アクセス違反が発生しましたが、それらがどのように異なっていたかを思い出せません。それで、ここに根本的に何か問題があるのでしょうか?
(sizeof(bigLut_t)が大きすぎてスタックに収まらないことに注意してください。)
編集:私は実際、これらの大きなオブジェクトを初期化する方法として、ybungalobillの小さなコメントのアイデアが一番好きです:
c++ - 前方宣言された構造体を返すのは未定義の動作ですか?
私は次のコードを持っています(簡単にするためにインクルードガードは省略されています):
= foo.hpp
=
= main.cpp
=
= foo_generator.hpp
=
= foo_generator.cpp
=
このコードは、現状では、警告なしで完全に正常にコンパイルされます。私の理解が正しければ、次のように出力されます。
ただし、代わりにランダムに表示されます。
または単にクラッシュします。
FOO の前方宣言を に置き換えるfoo_generator.hpp
と#include "foo.hpp"
、機能します。
だからここに私の質問があります: 前方宣言された構造を返すと、未定義の動作が発生しますか? または、何がうまくいかない可能性がありますか?
使用するコンパイラ: MSVC 9.0 および 10.0 (どちらも問題を示しています)
c++ - 自動変数へのポインタを削除する
このコードを見てください
このコードの結果は何ですか?特に3、5、7行目は?それらは未定義の動作を呼び出しますか?出力はどうなりますか?
編集:g ++を使用して実行してみましたが、コンパイルして正常に実行されています!私はWindows7でMinGWを使用しています。
この文脈でスタンダードは何と言っていますか?
c++ - (++i)++ は未定義の動作ですか?
(++i)++
未定義の動作ですか?後置インクリメントのインクリメントされたオブジェクトを取得した後に、前置インクリメントの副作用が発生する可能性はありますか? それは私には奇妙に思えるでしょう。
私の直感では、これは C++03 では定義されていませんが、C++11 では明確に定義されています。私は正しいですか?
fortran - fortran 90 のインテント (アウト) スプライス配列の未定義の動作?
これを行うと、非常に奇妙な動作が発生します。これが問題の原因だと思いますが、間違っている可能性があります。これが実際に未定義の動作であることを確認できる人がいれば、少なくとも何が起こっているのかを知ることができます
私が持っていると仮定します(コンパイルするふりをしません)
私の質問は次のとおりです。私は何か変なことをしていますか? スライスを渡したとしても、intent(out) がブロック全体を定義解除しているように感じ、inout が必要です。規格から確認できますか?
編集: inout は同じ未定義の動作をしますが、スライスされていない配列を Sub に渡すと機能します。これは、サブブロックの初期化のためにスライスされた配列を渡すことが標準に違反していることを意味しますか?
ありがとう
c++ - C++03とC++11の未定義動作の違いは何ですか?
新しい標準には、古い標準とは異なる未定義の動作があります。たとえば、新しいシーケンスルールは、以前は定義されていなかったいくつかの算術演算(シーケンスポイント間の複数の書き込みなどの理由)が定義されることを意味します。
では、未定義動作について新たに何を学ぶ必要があるのでしょうか。
c++ - 仮想コンストラクターのイディオム - 美徳または完全な完全な誤謬
C++ のゴールデン ルールの 1 つは、インスタンスの有効期間は、コンストラクターが正常に完了したときに始まり、デストラクターが開始されたときに終了するというものです。
このルールから、コンストラクターで仮想メソッドを呼び出すことはお勧めできません。派生インスタンスの可能性が無効であり、未定義の動作につながる可能性があるためです。
C++ FAQ 20.8で言及されている Virtual Constructor Idiomは、反対のことを示しているようです。
私の質問は:
- コンストラクタとデストラクタからの呼び出しに関連するオブジェクトの寿命を定義するための標準の正確な定義は何ですか?
- さらに、いわゆる「仮想コンストラクタ Idom」は有効ですか?
c++ - 非仮想デストラクタでの未定義の動作 - それは現実の問題ですか?
次のコードを検討してください。
私の理解では、C++ 標準では、b の削除は未定義の動作であると述べられています。つまり、何かが起こる可能性があります。しかし、現実の世界では、私の経験では ~A() は常に呼び出され、メモリは正しく解放されます。
B が独自のデストラクタを持つクラス メンバを導入した場合、それらは呼び出されませんが、ソース コードが 1 つのクラス メソッドのバグを修正するために継承が使用される、上記の単純な種類のケースにのみ関心があります。利用できません。
明らかに、これは自明ではないケースでは望んでいるものではありませんが、少なくとも一貫しています。示されているコードについて、上記が発生しないC++ 実装を認識していますか?