Является ли программа, которая никогда не завершает действительную программу C++?




language-lawyer undefined-behavior (2)

В стандарте C ++ нет ничего, что требовало бы завершения программы или любого другого потока. Наиболее близким к этому является [intro.progress]p1 , который говорит

Реализация может предполагать, что любой поток в конечном итоге выполнит одно из следующих действий:

  • прекратить,
  • сделать вызов функции ввода-вывода библиотеки,
  • выполнить доступ через изменчивое glvalue, или
  • выполнить операцию синхронизации или атомарную операцию.

[ Примечание: это предназначено для разрешения преобразований компилятора, таких как удаление пустых циклов, даже если завершение не может быть доказано. - конец примечания ]

Пока существует некоторое наблюдаемое поведение, в конце концов, или пока оно тратит все свое время, заблокированное на операцию ввода-вывода или другой вызов библиотеки блокировки, это не применяется, и программа действительна (при условии, что она соответствует всем другие критерии действительности).

Требуется ли прекращение работы программы? Другими словами, это программа, которая работает навсегда технически неопределенным поведением? Обратите внимание, что это не о пустых циклах. Разговор о программах, которые делают "вещи" (то есть наблюдаемое поведение) навсегда.

Например, что-то вроде этого:

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, серверы). Однако стандарт иногда бывает странным, поэтому возникает вопрос.

Тангенциальный: многие (некоторые?) Определения «алгоритма» требуют, чтобы алгоритм заканчивался , то есть последовательность операций, которая никогда не завершается, не считается алгоритмом.

Тангенциальное. Проблема остановки говорит о том, что не может существовать алгоритм, чтобы определить, завершается ли произвольная программа для ввода. Однако для этой конкретной программы, поскольку нет ветки, которая приводит к выходу из main, компилятор может легко определить, что программа никогда не закончится. Это, однако, не имеет значения, поскольку речь идет о языке юриста.


Да. От [intro.progress]

Реализация может предполагать, что любой поток в конечном итоге выполнит одно из следующих действий:

  • прекратить,
  • сделать вызов функции ввода-вывода библиотеки,
  • выполнить доступ через изменчивое glvalue, или
  • выполнить операцию синхронизации или атомарную операцию.

[ Примечание: это предназначено для разрешения преобразований компилятора, таких как удаление пустых циклов, даже если завершение не может быть доказано. - конец примечания ]







undefined-behavior