【24h】

Abstractions from proofs

机译:证明的抽象

获取原文

摘要

The success of model checking for large programs depends crucially on the ability to efficiently construct parsimonious abstractions. A predicate abstraction is parsimonious if at each control location, it specifies only relationships between current values of variables, and only those which are required for proving correctness. Previous methods for automatically refining predicate abstractions until sufficient precision is obtained do not systematically construct parsimonious abstractions: predicates usually contain symbolic variables, and are added heuristically and often uniformly to many or all control locations at once. We use Craig interpolation to efficiently construct, from a given abstract error trace which cannot be concretized, a parsominous abstraction that removes the trace. At each location of the trace, we infer the relevant predicates as an interpolant between the two formulas that define the past and the future segment of the trace. Each interpolant is a relationship between current values of program variables, and is relevant only at that particular program location. It can be found by a linear scan of the proof of infeasibility of the trace.We develop our method for programs with arithmetic and pointer expressions, and call-by-value function calls. For function calls, Craig interpolation offers a systematic way of generating relevant predicates that contain only the local variables of the function and the values of the formal parameters when the function was called. We have extended our model checker Blast with predicate discovery by Craig interpolation, and applied it successfully to C programs with more than 130,000 lines of code, which was not possible with approaches that build less parsimonious abstractions.
机译:对大型程序进行模型检查的成功与否,在很大程度上取决于有效构造简约抽象的能力。谓词抽象是简约的,如果它在每个控制位置仅指定变量的 current 值之间的关系,并且仅指定证明正确性所需的关系。自动提炼谓词抽象直到获得足够的精度之前的方法不能系统地构造简约抽象:谓词通常包含符号变量,并且会被启发式地且通常一次均匀地添加到许多或所有控制位置。我们使用Craig插值从无法具体化的给定抽象错误迹线有效构造删除该迹线的次抽象。在轨迹的每个位置,我们将相关谓词推断为定义轨迹的过去和将来段的两个公式之间的插值。每个插值是程序变量当前值之间的关系,并且仅在该特定程序位置相关。可以通过对迹线的不可行性进行线性扫描来找到它。我们针对具有算术和指针表达式以及按值调用函数调用的程序开发了我们的方法。对于函数调用,Craig插值提供了一种系统的方式来生成相关谓词,这些谓词仅包含函数的局部变量和调用函数时形式参数的值。我们已经通过Craig插值的谓词发现扩展了模型检查器 Blast ,并将其成功应用于代码行数超过130,000行的C程序,这对于构建较少简约抽象的方法是不可能的。

著录项

相似文献

  • 外文文献
  • 中文文献
  • 专利
获取原文

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号