是否发现C/C++代码中的指针静态等效于HaltingΡroblem?

Jen*_*ens 7 c c++ pointers static-analysis halting-problem

我并没有深入根植于静态代码分析的正式方面,因此这个问题.

几年前,我读到使用静态代码分析区分代码和数据等同于暂停问题.(引用需要,但我不再拥有它了.Stackoverflow在这里这里有线程.)至少对于基于冯诺依曼架构的常见计算机架构,其中代码和数据共享相同的内存,这似乎是有意义的.

现在我正在研究C/C++代码和指针分析的静态分析; 该程序不执行.不知怎的,我有一种感觉,静态跟踪指针值的所有创建和使用类似于停止问题,因为我无法确定内存中的给定值是否是指针值,即我无法通过指针值跟踪指针值的值记忆. 别名分析可能会缩小问题范围,但面对多线程代码似乎变得不那么有用了.

(人们甚至可以考虑跟踪任意值,而不仅仅是指针:为任何给定的"有趣"值构建一个完整的值流似乎等同于停止问题.)

由于这只是一种预感,我的问题是:我可以参考更正式的发现吗?我错了吗?

R..*_*R.. 1

它几乎肯定是等价的,以 C 不是图灵等效语言这一事实​​为模(由于类型的表示,给定的 C 实现是一个巨大的有限状态机而不是图灵机)。在有效类型为指针类型的对象中,指针不需要保留其原始表示形式;您可以检查表示形式并对其执行任意操作,例如,加密指针并稍后解密。确定任意计算是否可逆,或者两个计算是否彼此相反,(即兴)可能相当于确定停止。

  • @Cheersandhth.-Alf 无限流“stdin”和“stdout”是无限带的一个可怕的即兴示例,因为图灵机无限带是可以写入和读回相同内容的东西。然而,我们可以将 C 程序与无限功能区连接起来。这样的复合C程序+ribbon将是一个合适的图灵机。然而,这并不是一个很有见地的说法,因为与无限带连接的有限自动机也是图灵机。这并没有告诉我们 C 程序不仅仅是一个有限自动机。 (2认同)