静态分析中的抽象解释如何在没有正式规范的情况下使用

How can abstract intepretation in static analysis be used without formal specification

最近看了很多关于形式化验证的内容,对这个话题很着迷。但是我无法弄清楚以下内容:
形式验证需要正式规范,因此当没有程序的正式规范时,how 可以是编译器中任何源代码的抽象解释?

似乎正确的外语文本翻译(而且似乎不需要正式规范。)

If a program is represented by its control flow chart, then each branch represents a program state (can be more than one - e.g. in a loop a branch is traversed multiple times) and abstract intepretation creates static semantics that approximates the set of this states.

这里有一篇关于抽象解释作为形式验证技术的文章:http://www.di.ens.fr/~cousot/publications.www/Cousot-NFM2012.pdf

抽象解释是一种用于静态了解软件行为方式的方法。它永远不会单独出现 - 总会有一些目标,其中包括抽象解释作为其组成部分之一。

这种目标的一个例子是形式验证,其中使用静态技术(例如,抽象解释)来获取有关代码的信息,然后将其与提供的规范进行比较。这就是验证需要规范的原因 - 您需要一些东西来与之进行比较。

可以 "concrete interpretation" 为一种语言构建解释器,根据语言规范手册计算结果。 (语言手册是非正式的这一事实使这种解释器的正确性受到永久怀疑)。

抽象解释只需要对程序语义有很好的理解,并且知道什么是值得抽象的。您可以通过使用上面的解释器,并将实际计算替换为计算的抽象来实现这一点,例如,您可以决定将所有整数值表示为 "positive"、"zero"、"negative",或 "unknown"。你仍然可以用它来计算,现在产生定性结果。更重要的是,您可以使用它进行计算,而无需实际的程序输入(可能只是抽象值)。我注意到抽象解释器在正式意义上也是完全不可信的,因为您仍在使用非正式参考手册作为语言将要做什么的指南进行计算。

现在,通过 运行 这样一个抽象程序,您可能会发现它会出错(例如,取消引用空值),控制空值的变量不是 "undefined"。在这种情况下,您可以建议程序中存在错误;你可能不对,但这可能会产生有用的结果。

实践中的抽象解释无处可以告诉您程序正式计算的内容,因为您仍在使用非正式的参考手册。如果手册要成为正式文件,并且您的抽象解释器是通过可证明正确的步骤派生的,那么我们可能会同意程序的抽象解释是一种对 程序的抽象进行模化的规范 确实如此。

抽象解释无处提供对程序意图的正式规范的访问。所以你不能单独使用它来证明程序 "correct" 与规范有关。