是否有可能有一个编译器可以预测每个可能的“特定情况”运行时错误?

时间:2009-10-04 05:02:05

标签: compiler-theory

“特定情况”我的意思是它使用了一些可以访问的数据,例如当前的数据库设置,某些操作系统的版本等等。

想象一下,如果编译器检查你当前在你的应用程序中使用的数据库,并打电话给你一个警告说 '只是你知道,数据库中的当前数据永远不会触发你的声明写了 '或类似' 之类的东西你知道吗,如果这变成了一个空值,你真的会被搞砸 '...它可以可能需要一段时间,但如果它有一些东西要去(例如当前的数据库),它可能有一些东西需要检查,而不仅仅是“每种可能性”。

您认为这是可行/有价值的吗?这是否存在于任何地方?

如果有一个量子编译器可以找出所有可能性并自动提出异常处理等,那将是很酷的。

6 个答案:

答案 0 :(得分:5)

我无法保证,但这似乎与Halting问题同构,已知这是不可能的。

答案 1 :(得分:3)

正如詹姆斯怀疑的那样,这与停止问题是同构的,因此是不可能的。

事实上,这个问题可以简单地减少到编译Perl(因为Perl需要依赖于情境的知识)。有一个simple, elegant proof Perl 实际上不能编译。

因此,我们至少有一个反例(Perl),其中静态编译器无法检查程序的正确性,因此与假设相矛盾。 QED

答案 2 :(得分:0)

这在我所知道的任何地方都不存在(尚未)。但是我真的很喜欢 humanized 错误消息的想法:

You know, if this becomes a null value you are really going to be screwed.

关于这是否可行:我会说及时发生任何事情,所以谁真正知道(以及我是谁来预测未来)。

有价值吗 YEAH!这将是一个巨大的节省时间,如果它做了你说的话,那就是提出异常处理,它将是有史以来最有用的工具之一。 永远!!!

答案 3 :(得分:0)

听起来你在谈论一种复杂的data-flow analysis形式。现有编译器使用此技术,static analysis tools广泛使用。目前可能没有像你提出的那样先进的工具,但这并不意味着在有足够时间和研究的情况下无法创建它。

答案 4 :(得分:0)

这在理论上是可行的,但不太可能。实质上,您正在做的是要求静态分析使用一些辅助数据来验证某些声明。这通常是可能的,但静态分析通常会受到一定程度的不精确性的影响。例如,如果我有代码块:

If(getResultFromDB() == someResult) {
do this;
} else {
do that;
}

如果你在if的第一个块中编写代码,你基本上希望分析能够向你抱怨,因为数据库永远不会返回someResult。这在理论意义上是可能的,我的意思是它只需要检查给定数据库的函数getResultFromDB()的所有可能的返回值,然后在答案上结束。

问题是这个数字绝对是巨大的。这通常是静态分析的一个问题,为了得到精确的结果,我们需要考虑所有可能的执行路径,输入,上下文等。在实践中这是根本不可行的,所以静态分析通常会在减少的地方做出让步它的当前可能性的大小。

编辑:如果您对高级静态分析感兴趣,那么这是我前几天阅读的有趣分析。它试图在PHP源代码中找到可能的XSS攻击。要查找涉及数据库的XSS攻击,它实际上模拟了数据库查询在某种抽象数据库中的影响。 http://www.cs.washington.edu/homes/mernst/pubs/create-attacks-tr054.pdf

答案 5 :(得分:0)

虽然这个问题可能无法完全解决,但仍有一些尝试让静态分析尽可能聪明,其中之一 - 来自Wesner Moise的NStatic - 预期设定得相当高(这也可能是原因)该工具没有发货,似乎不会很快发货:))

http://wesnerm.blogs.com/net_undocumented/nstatic/