程序永远不会终止有效的C ++程序吗?

bol*_*lov 15 c++ undefined-behavior language-lawyer

是否需要终止程序?换句话说,是一个在技术上永远无法运行的程序吗?请注意,这与空循环无关。谈论永远做“东西”(即可观察到的行为)的程序。

例如这样的事情:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这更多是一个学术问题,因为根据经验,所有理智的编译器都会为上述程序生成预期的代码(当然,假设没有其他UB来源)。是的,当然,有很多程序永远都不会终止(操作系统,嵌入式服务器)。但是有时标准是古怪的,因此是个问题。


切线:“算法”的许多(某些)定义要求算法必须终止,即,一系列永不终止的运算不被视为算法。


相切的。暂停问题指出,无法存在一种算法来确定任意程序是否针对输入完成。但是,对于该特定程序,由于没有导致退出main的分支,因此编译器可以轻松确定该程序永远不会结束。但是,这是无关紧要的,因为问题是语言律师。

Dan*_*l H 15

C ++标准中没有要求程序或任何给定线程终止的内容。最接近的是[intro.progress] p1,它表示

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

  • 终止,
  • 调用库I / O函数,
  • 通过可变的glvalue进行访问,或
  • 执行同步操作或原子操作。

[?注意:这旨在允许编译器转换,例如删除空循环,即使无法证明终止也是如此。?—?尾注?]

只要最终出现某种可观察到的行为,或者只要它将所有时间都花在了I / O操作或另一个阻塞库调用上,就不适用,并且该程序有效(假定它满足所有其他有效性标准)。