問題タブ [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++ - 文字列 s; &s+1; 法的?ウブ?
次のコードを検討してください。
ここで興味深いのは&myAry[numStrs]
、numStrs が 5 に等しいため、&myAry[numStrs]
存在しないものを指しているということです。配列の6 番目の要素。上記のコードには、この別の例があります: myVec.end()
は、 vector の 1 つ後ろの端を指しmyVec
ます。存在しないこの要素のアドレスを取得することは完全に合法です。のサイズがstring
わかるので、s の C スタイル配列の 6 番目の要素のアドレスがどこをstring
指す必要があるかがわかります。このポインターを評価するだけで、逆参照しない限り、問題ありません。等しいかどうかを他のポインターと比較することもできます。STL は、一連の反復子に作用するアルゴリズムで常にこれを行います。イテレータはend()
最後を超えてポイントし、ループは counter の間ループし続けます!= end()
。
だから今これを考えてみましょう:
このコードは合法で明確に定義されていますか? のように、配列要素のアドレスを最後を超えて取得することは合法であり、明確に定義されてい&myAry[numStrs]
ますmyPtr
。
c++ - nullインスタンスでメンバー関数を呼び出すと、未定義の動作が発生するのはいつですか?
次のコードを検討してください。
nullポインタに(b)
対応するメンバーがないため、クラッシュすることが予想されます。x
実際には、ポインタが使用されることはない(a)
ため、クラッシュしません。this
nullの逆参照は常に未定義の動作であると言われるため(b)
、this
ポインタ((*this).x = 5;
)を逆参照し、 this
nullであるため、プログラムは未定義の動作に入ります。
(a)
未定義の動作になりますか?両方の関数(およびx
)が静的である場合はどうでしょうか?
c++ - イニシャライザリストのプライベート関数呼び出しの場合の未定義動作ですか?
次のコードを検討してください。
struct Calc
get_coef1
電話をかけたときに完全に定義されていませんget_coef2
。このコードは有効ですか?UBを取得できますか?
c - cの「通常の」変数の前の配列の宣言?
現在、msp430 MCU 用のアプリケーションを開発しており、奇妙な問題が発生しています。「通常の」変数の宣言後にスコープ内で配列を宣言すると、未定義のように見える動作が発生することがあることがわかりました。このような:
foo には 2 番目の変数としてポインターが渡されますが、これはarr配列を指していないことがあります。プログラムを 1 ステップ実行してこれを確認し、メイン スコープの arr array-as-a-pointer 変数の値が foo スコープの b ポインター変数の値と同じではないことを確認します。いいえ、これは実際には再現可能ではありません。たまにこの動作を確認しただけです。
これは、foo 関数の 1 行が実行される前でも観察できます。渡されたポインター パラメーター (b) は単に arr のアドレスを指していません。
次のように、例を変更すると問題が解決するようです。
なぜ私たちがこの行動を経験するのかについて、誰かが何か意見やヒントを持っていますか? それとも似たような経験?MSP430 プログラミング ガイドでは、コードが ANSI C89 仕様に準拠する必要があることを指定しています。それで、配列は非配列変数の前に宣言する必要があると言っているのだろうかと思っていましたか?
これに関するご意見をいただければ幸いです。
アップデート
@Adam Shiemke と tomlogic:
宣言内の値を初期化するさまざまな方法について、C89が何を指定しているのか疑問に思っています。次のようなものを書くことは許されていますか?
もしそうなら、どうですか:
それは許されますか?以下は違法なC89に違いないと思います:
前もって感謝します。
更新 2 問題が解決しました。基本的に、関数 (foo) を呼び出す前と変数の宣言後に割り込みを無効にします。簡単な例で問題を再現することができました。解決策は、無効化割り込み呼び出しの後に _NOP() ステートメントを追加することです。
誰かが興味を持っている場合は、問題を再現する完全な例と修正を投稿できますか?
これに関するすべての入力に感謝します。
c++ - 構築前のインスタンスで非メンバー関数を呼び出す
私はクラスを書いていますが、この疑問が浮かびました。これは undef ですか。行動?一方、それが推奨されているのか、それとも良い習慣なのかはわかりません。init 関数で例外がスローされないようにする場合は 1 ですか?
前もって感謝します
javascript - string.replace での Javascript の未定義の動作
私は string.replace をいじっていましたが、Webkit と Firebug の JavaScript コンソールで非常に奇妙なことに気付きました。
空白のブラウザー ウィンドウでこの動作を繰り返すことができます。(最初と最後の行を見てください)
私が何かをタイプミスしたと誰も思わないように、ここにスクリーンショットがあります。
ファイアーバグ (3.0.14)
Webkit (この投稿の作成時点での最新の夜間)
c++ - C++でデストラクタを2度目に未定義の動作で呼び出すのはなぜですか?
この回答で述べたように、デストラクタを 2 回目に呼び出すだけでは、未定義の動作 12.4/14(3.8) になります。
例えば:
この例では、デストラクタを複数回呼び出すことができるようにクラスが設計されています - 二重削除のようなことは起こりません。が呼び出された時点で、メモリはまだ割り当てられています。delete
最初のデストラクタ呼び出しでは、::operator delete()
メモリを解放するために が呼び出されません。
たとえば、Visual C++ 9 では、上記のコードは機能しているように見えます。UB の C++ 定義でさえ、UB として認定されたものの動作を直接禁止するものではありません。そのため、上記のコードが実装やプラットフォームの仕様を壊すには、いくつかの仕様が必要です。
上記のコードが正確に壊れる理由と、どのような条件でしょうか?
c++ - 未定義の動作はそれだけの価値がありますか?
未定義の動作が原因で、多くの悪いことが発生し、発生し続けています (発生しないかどうかはわかりませんが、何かが発生する可能性があります)。これが導入されたのは、コンパイラが最適化する余地を残すためであり、C++ をさまざまなプラットフォームやアーキテクチャに簡単に移植できるようにするためでもあると理解しています。ただし、未定義の動作によって引き起こされる問題は、これらの議論によって正当化するには大きすぎるようです。未定義の動作の他の引数は何ですか? 存在しない場合、未定義の動作がまだ存在するのはなぜですか?
編集私の質問にいくつかの動機を追加するには:C ++の狡猾な同僚とのいくつかの悪い経験のために、私は自分のコードを可能な限り安全にすることに慣れてきました。すべての引数、厳密な const-correctness などをアサートします。私のコードを間違った方法で使用する余地はほとんどないので、そこから離れようとします。これまでの経験から、抜け穴があると人々がそれを使用し、私のコードが悪いと電話がかかってくることがわかっているからです。コードを可能な限り安全にすることは、良い習慣だと考えています。これが、未定義の動作が存在する理由を理解できない理由です。かなりのオーバーヘッドがなければ、実行時またはコンパイル時に検出できない未定義の動作の例を教えてください。
c - このコードがまだ機能したのはなぜですか?
私がちょうど出くわしたいくつかの古いコード:
これはリンクリストを作成するために呼び出されていましたが、ステートメントがないことに気づきました。
そこにreturnステートメントがなくても、リストは適切に作成されました。なぜこれが起こったのですか?
編集:プラットフォーム:Mandriva200964ビットLinux2.6.24.7-サーバーGCC4.2.3-6mnb1
編集:おかしい...このコードは、約5つの異なるLinuxインストール、すべての異なるバージョン/フレーバー、およびMacでも正常に実行されました。