为什么无法消除无限循环?

时间:2015-03-25 22:59:27

标签: c++ halting-problem as-if

" as-if"这些规则涵盖了规则:

  

符合实施的最低要求是:

     
      
  • 严格按照抽象机的规则评估对易失性对象的访问。

  •   
  • 在程序终止时,写入文件的所有数据应与执行程序的可能结果相同   根据抽象语义会产生。

  •   
  • 交互式设备的输入和输出动态应以促使输出实际传递的方式进行   在程序等待输入之前。什么构成互动   设备是实现定义的。

  •   
     

这些统称为程序的可观察行为。

     

...访问由volatile glvalue(3.10)指定的对象,   修改对象,调用库I / O函数或调用   执行任何这些操作的功能都是副作用   是执行环境状态的变化。 ...

但是,让我们采取以下计划:

while (1) { }
// or
for (;;) { }

事实上,没有对象或函数调用,因此没有副作用,因此执行环境的状态没有变化"。什么阻止编译器将此代码编译为

xorl    %eax, %eax
retq

这是不确定性的吗?一个无限循环本质上是"这里是一个标签,一遍又一遍地跳到它上面。并将继续,直到计算机关闭。代码没有任何意义,没有计算,没有I / O输出等。

在内核代码中,无限循环变得有趣。但是在用户空间代码中,无限循环通常是编写错误程序的标志。那么我的逻辑中的缺陷是什么?

1 个答案:

答案 0 :(得分:3)

它可以,因为[intro.multithread] / p27(引用N4140;这是N3337中的p24):

  

实现可以假设任何线程最终都会执行一个   以下内容:

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

在C ++ 11及更高版本中,空无限循环是UB。