这是无限递归UB吗?

时间:2011-05-05 23:19:56

标签: c++ recursion c++11 undefined-behavior

在C ++ 11中,作为一个没有副作用的无限循环,以下程序是UB:

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

以下是UB吗?

void foo() {
   foo();
}

int main() {
   foo();
}

两个计划的标准引文都是理想的。

2 个答案:

答案 0 :(得分:20)

这是UB,因为它的循环不是措辞,而是(1.10p24):

  

实现可能假设任何线程最终将执行以下操作之一:

     
      
  • 终止,
  •   
  • 调用库I / O函数,
  •   
  • 访问或修改易失性对象,或
  •   
  • 执行同步操作或原子操作。
  •   

这适用于两者,而不是其中一个C ++ 0x草案中较旧的公式。 (参见this question进行讨论)。

请注意,忽略这一点,如果递归超过嵌套递归函数调用数的实现限制,则很容易定义该行为。情况一直如此。

答案 1 :(得分:1)

我不认为标准说行为是未定义的,它只是说没有副作用的循环可能会被假定最终终止。

所以:

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

可能会终止或永久循环。

void foo() {
   foo();
}

int main() {
   foo();
}

也可能终止,永远循环,或者可能用完堆栈空间(如果编译器没有实现尾递归)。

我认为除了列出之外,我们都没有权利做任何其他事情,因此我认为这种行为完全没有定义"。