タグ付けされた質問 「undefined-behavior」

13
未定義行動の背後にある哲学
C \ C ++仕様では、コンパイラが独自の方法で実装するための多数の動作が公開されていません。同じことについて常にここで質問され続ける多くの質問があり、それに関するいくつかの素晴らしい投稿があります: https://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviour-that-ac-programmer-should-know-abo https://stackoverflow.com/questions/4105120/what-is-undefined-behavior https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points 私の質問は、未定義の振る舞いについてではなく、本当に悪いことです。危険と標準からの関連する未定義の動作の引用のほとんどを知っているので、それがどれほど悪いかについての回答を投稿することは控えてください。この質問は、コンパイラ実装のために非常に多くの動作を開いたままにすることの背後にある哲学に関するものです。 パフォーマンスが主な理由であると述べている素晴らしいブログ記事を読みました。パフォーマンスがそれを許可するための唯一の基準であるのか、それともコンパイラー実装のためにオープンなままにする決定に影響する他の要因があるのか​​疑問に思っていましたか? 特定の未定義の動作がコンパイラが最適化するのに十分な余地を提供する方法について引用する例がある場合は、それらをリストしてください。パフォーマンス以外の他の要因を知っている場合は、十分な詳細を含めて回答を返してください。 質問を理解していないか、回答を裏付ける十分な証拠/情報源がない場合は、広く推測する回答を投稿しないでください。

11
C ++には「未定義の動作」(UB)があり、C#やJavaなどの他の言語にはないのはなぜですか?
このStack Overflowの投稿には、C / C ++言語仕様が「未定義の動作」であると宣言している状況のかなり包括的なリストがリストされています。ただし、C#やJavaなどの他の現代言語に「未定義の動作」という概念がない理由を理解したいと思います。つまり、コンパイラの設計者は、考えられるすべてのシナリオ(C#およびJava)を制御できるかどうか(CおよびC ++)を制御できますか?

10
「i ++ == ++ i」の場合、C開発者はどうしてそんなに興味を持ちますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 単なるランダムな観察ですが、StackOverflow.comでは、「++ i == i ++」であるかどうかに関する質問があるようです。しかし、この質問は常に聞かれます。過去2か月間に約6〜7回質問されたのを見たと思います。 なぜC開発者がそれに興味を持っているのだろうか?C#およびJava開発者にも同じ概念/質問が存在しますが、C#に関連する質問は1つしか見なかったと思います。 多くの例で++ iを使用しているからですか?人気のある本やチュートリアルがあるからでしょうか?それは、C開発者が「効率」/「パフォーマンス」のために可能な限り1行に詰め込んで、++演算子を使用する「奇妙な」コンストラクトに頻繁に遭遇するためです。

5
Javaの未定義の動作
私は、SOでこの質問を読んでいて、C ++の一般的な未定義の動作について説明していましたが、Javaにも未定義の動作がありますか? その場合、Javaの未定義の動作の一般的な原因は何ですか? そうでない場合、Javaのどの機能がそのような動作から解放されますか?これらのプロパティでCおよびC ++の最新バージョンが実装されていないのはなぜですか?

4
Cの未定義の動作がいつ因果関係の壁を跳んだのか
一部のハイパーモダンCコンパイラは、特定の入力が与えられたときにプログラムが未定義の動作を呼び出す場合、そのような入力は決して受信されないと推測します。その結果、そのような入力が受信されない限り無関係であるコードは排除される可能性があります。 簡単な例として、 void foo(uint32_t); uint32_t rotateleft(uint_t value, uint32_t amount) { return (value << amount) | (value >> (32-amount)); } uint32_t blah(uint32_t x, uint32_t y) { if (y != 0) foo(y); return rotateleft(x,y); } コンパイラは、の評価が0のvalue >> (32-amount)場合に未定義の動作を生成するためamount、関数が0でblah呼び出されることはないと推測yします。fooしたがって、呼び出しは無条件にすることができます。 私が言うことができることから、この哲学は2010年頃にいつか定着したようです。そのルーツについて私が見た最も初期の証拠は2009年に遡り、未定義の動作が発生した場合に明示的に述べているC11標準に安置されていますプログラムの実行のある時点で、プログラム全体の動作が遡って定義されなくなります。 コンパイラは、IEで未定義の動作(逆因果最適化を正当化するために未定義の動作を使用することを試みるべきであるという考えたrotateleft機能がそれを前提とするコンパイラを起こすべきではblah非ゼロと呼ばれている必要がありますy何が今まで引き起こすかどうか、yにゼロ以外の値を保持する)2009年より前に真剣に提唱されましたか?最適化手法として最初に真剣に提案されたのはいつですか。 [補遺] 一部のコンパイラには、20世紀でさえ、ループとその中で計算された値に関する特定の種類の推論を有効にするオプションが含まれています。たとえば、 int i; int total=0; for (i=n; i>=0; i--) { doSomething(); …

5
原則として未定義の動作
CでもC ++でも、CまたはC ++標準に従って動作が定義されていないこの不正なプログラムは興味深いと思います。 #include <stdio.h> int foo() { int a; const int b = a; a = 555; return b; } void bar() { int x = 123; int y = 456; } int main() { bar(); const int n1 = foo(); const int n2 = foo(); const int n3 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.