Это бесконечная рекурсия UB? - PullRequest
23 голосов
/ 06 мая 2011

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

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

Является ли следующее UB?

void foo() {
   foo();
}

int main() {
   foo();
}

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

Ответы [ 2 ]

20 голосов
/ 06 мая 2011

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

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

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

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

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

1 голос
/ 06 мая 2011

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

Итак:

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

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

void foo() {
   foo();
}

int main() {
   foo();
}

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

Не знаюдумаю, что любой имеет какое-либо право на что-либо, кроме перечисленного, поэтому я не думаю, что поведение полностью "неопределенное".

...