1. ホーム
  2. c++

[解決済み] 未定義の動作を含むソースコードがコンパイラをクラッシュさせることは合法ですか?

2023-05-18 12:54:52

質問

未定義の動作を呼び出すため、(よく言われるように) "anything can happen" となる、お粗末に書かれた C++ ソースコードをコンパイルしに行ったとしましょう。

C++ 言語仕様が "conformant" コンパイラーで許容されるとみなすものの観点から、このシナリオにおける "anything" にはコンパイラーのクラッシュ (または私のパスワードの盗難、あるいはコンパイル時の誤動作やエラー出力) が含まれますか、それとも未定義の動作の範囲は結果の実行可能ファイルを実行したときに何が起こるかに特に限定されますか?

どのように解決するのですか?

未定義動作の規範的な定義は以下の通りです。

[defns.undefined]です。

この国際規格が要求していない行動

[注:この国際規格が動作の明示的な定義を省略している場合、またはプログラムが動作の定義に違反している場合、未定義の動作が予想されます。 動作の明示的な定義が省略されている場合、またはプログラムが誤った構成や誤ったデータを使用した場合 誤った構成やデータを使用した場合、未定義の動作が発生する可能性があります。許容される未定義の を完全に無視することから、予測できない結果をもたらすことまで、さまざまな動作があります。 予測不可能な結果をもたらす完全な無視から,翻訳中またはプログラム実行中に 環境に特徴的な文書化された方法で実行する。 (診断メッセージの発行の有無にかかわらず)、翻訳または実行を終了させることまでです。 翻訳または実行を終了する(診断メッセージの発行あり)。 を発行する)。多くの誤ったプログラム構成は,未定義の動作を発生させない。 診断が必要である。定数式の評価 式の評価は、未定義として明示的に指定された振る舞いを示すことはない。  - エンドノート]

このノート自体は規範的なものではありませんが、実装が示すことが知られている動作の範囲を記述しています。そのため、コンパイラーをクラッシュさせる (翻訳を突然終了させる) ことは、その注意書きによると正当なことです。しかし実際には、規範的な文章にあるように、この規格は実行と翻訳のどちらにも境界を設けていません。もし実装があなたのパスワードを盗んだとしても、それは標準に定められたいかなる契約にも違反しません。