Подтвердить что ты не робот

Это бесконечная рекурсия UB?

В С++ 11, как бесконечный цикл без побочных эффектов, следующая программа UB:

int main() {
   while (true) {}
}

Является ли также UB?

void foo() {
   foo();
}

int main() {
   foo();
}

Цитаты из стандарта для обеих программ были бы идеальными.

4b9b3361

Ответ 1

Это UB, потому что он не сформулирован в терминах циклов, а в терминах (1.10p24):

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

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

Это относится к обоим, в отличие от более старой формулировки в одном из черновиков С++ 0x. (См. этот вопрос для обсуждения).

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

Ответ 2

Я не думаю, что стандарт говорит, что поведение undefined, он просто говорит, что цикл, который не имеет побочных эффектов, может считаться окончательным.

Итак:

int main() {
   while (true) {}
}

Может завершаться или цикл навсегда.

void foo() {
   foo();
}

int main() {
   foo();
}

Может также завершаться, зацикливаться навсегда или, возможно, заканчиваться из пространства стека (если компилятор не реализует хвостовую рекурсию).

Я не думаю, что я имею право делать что-либо кроме перечисленных, поэтому я не думаю, что поведение полностью "undefined".