タグ付けされた質問 「unreachable-code」

9
到達できないコードですが、例外はあります
このコードは、ODBCに接続されたデータベースの読み取りと書き込みを行うアプリケーションの一部です。データベースにレコードを作成し、レコードが正常に作成されたかどうかを確認して、を返しtrueます。 制御フローについての私の理解は次のとおりです。 command.ExecuteNonQuery()Invalid​Operation​Exception「メソッドの呼び出しがオブジェクトの現在の状態に対して無効である場合」をスローするようにドキュメント化されています。したがって、それが発生した場合、tryブロックの実行が停止し、finallyブロックが実行され、最後にが実行されreturn false;ます。 しかし、私のIDEは、これreturn false;が到達不能なコードであると主張しています。そしてそれは本当のようです、私はそれを削除することができ、それは文句なしにコンパイルされます。ただし、私にとっては、上記の例外がスローされるコードパスの戻り値がないように見えます。 private static bool createRecord(String table, IDictionary<String,String> data, System.Data.IDbConnection conn, OdbcTransaction trans) { [... some other code ...] int returnValue = 0; try { command.CommandText = sb.ToString(); returnValue = command.ExecuteNonQuery(); return returnValue == 1; } finally { command.Dispose(); } return false; } ここで私の理解の誤りは何ですか?

8
動作が未定義のブランチは到達不能と見なされ、デッドコードとして最適化されますか?
次のステートメントを検討してください。 *((char*)NULL) = 0; //undefined behavior 明らかに未定義の動作を引き起こします。特定のプログラムにそのようなステートメントが存在するということは、プログラム全体が未定義であること、または制御フローがこのステートメントにヒットしたときにのみ動作が未定義になることを意味しますか? 次のプログラムは、ユーザーが番号を入力しない場合に備えて明確に定義されています3か? while (true) { int num = ReadNumberFromConsole(); if (num == 3) *((char*)NULL) = 0; //undefined behavior } それとも、ユーザーが何を入力しても、完全に未定義の動作ですか? また、コンパイラは、未定義の動作が実行時に実行されないことを想定できますか?これにより、時間を遡って推論することができます。 int num = ReadNumberFromConsole(); if (num == 3) { PrintToConsole(num); *((char*)NULL) = 0; //undefined behavior } ここで、コンパイラーは、num == 3未定義の動作を常に呼び出す場合に備えて推論することができます。したがって、このケースは不可能でなければならず、番号を印刷する必要はありません。ifステートメント全体を最適化することができます。この種の後方推論は規格に従って許可されていますか?

2
Rustが誤った戻り型のコードを許可するのはなぜですか?
次のRustコードを考えます。 fn f() -> i32 { loop { println!("Infinite loop!"); } println!("Unreachable"); } 戻り値の型が間違っているにもかかわらず、これは(警告付きで)コンパイルされて実行されます。コンパイラーは()、このコードに到達できないことを検出するため、最終行の戻り値のタイプがOKであるように見えます。 ただし、最後のセミコロンを削除すると、次のようになります。 fn f() -> i32 { loop { println!("Infinite loop!"); } println!("Unreachable") } その後、コードはコンパイルされなくなり、型エラーが発生します。 error[E0308]: mismatched types --> src/main.rs:14:5 | 14 | println!("Unreachable") | ^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `()` | = note: this error originates in …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.