有効なC++プログラムを終了させないプログラムはありますか?




language-lawyer undefined-behavior (2)

C ++標準には、プログラムまたは特定のスレッドの終了を必要とするものはありません。 [intro.progress]p1 最も近いものは [intro.progress]p1

実装は、スレッドが最終的に次のいずれかを実行すると想定する場合があります。

  • 終了、
  • ライブラリI / O関数を呼び出す、
  • volatile glvalueを介してアクセスを実行する、または
  • 同期操作またはアトミック操作を実行します。

[ 注: これは、終了を証明できない場合でも、空のループの削除などのコンパイラー変換を許可することを目的としています。 — 終了ノート ]

何らかの 観察可能な動作が ある 限り、最終的に、またはすべての時間をI / O操作または別のブロックライブラリ呼び出しでブロックされている限り、これは適用されず、プログラムは有効です(すべての条件を満たす場合)その他の有効性基準)。

プログラムを終了する必要がありますか? 言い換えれば、技術的に永久に実行されるプログラムは未定義の動作ですか? これは空のループに関するものではないことに注意してください。 永久に「もの」(すなわち、観察可能な動作)を行うプログラムについて話す。

たとえば、次のようなものです。

int main()
{
    while (true)
    {
        try
        {
            get_input(); // calls IO
            process();
            put_output(); // calls IO, has observable behavior

            // never break, exit, terminate, etc
        } catch(...)
        {
            // ignore all exceptions
            // don't (re)throw
            // never go out of loop
        }
    }
}

経験的にすべての正気なコンパイラーが上記の種類のプログラムに対して予想されるコードを生成するため、これは学術的な問題です(もちろんUBの他のソースがないと仮定します)。 もちろん、終了しないプログラム(os、embeded、servers)がたくさんあります。 しかし、標準は時々風変わりであるため、問題です。

接線:「アルゴリズム」の多くの(一部?)定義では 、アルゴリズムが終了する必要があります 。つまり、終了しない一連の操作はアルゴリズムと見なされません。

接線。 停止の問題は、入力に対して任意のプログラムが終了するかどうかを判断するアルゴリズムが存在できないことを示しています。 ただし、この特定のプログラムでは、メインから抜け出すことにつながる分岐がないため、コンパイラはプログラムが終了しないことを簡単に判断できます。 ただし、質問は言語弁護士であるため、これは無関係です。


はい。 [intro.progress] から

実装は、スレッドが最終的に次のいずれかを実行すると想定する場合があります。

  • 終了、
  • ライブラリI / O関数を呼び出す、
  • volatile glvalueを介してアクセスを実行する、または
  • 同期操作またはアトミック操作を実行します。

[ 注: これは、終了を証明できない場合でも、空のループの削除などのコンパイラー変換を許可することを目的としています。 — 終了ノート ]







undefined-behavior