【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.
机译:大型计划的模型检查的成功依赖于有效构建定量抽象的能力。谓词抽象是解析的,如果在每个控制位置,它只指定了当前变量值之间的关系,并且只有那些需要证明正确性的关系。以前用于自动精炼谓词抽象的方法,直到获得足够的精度,不会系统地构建解析抽象:谓词通常包含符号变量,并且在启动的方式并且通常一次地向许多或所有控制位置均匀地添加到许多或所有控制位置。我们使用Craig插值来有效地构造,从给定的抽象错误轨迹,不能解决删除轨迹的映像抽象。在轨迹的每个位置,我们将相关谓词推断为定义过去和迹线的未来段的两个公式之间的内插。每个Interpolant都是程序变量的当前值之间的关系,并且仅在该特定程序位置相关。可以通过线性扫描来找到迹线的不可行性证明。我们为具有算术和指针表达式的程序开发了方法,以及逐个值函数调用。对于函数调用,CRAIG插值提供了一种系统的方法,可以生成只包含函数的局部变量的相关谓词以及调用函数时的正式参数的值。通过Craig插值,我们将模型检查器BLAST扩展了谓词发现,并将其成功应用于超过130,000行代码的C程序,这是不可能构建较少解析抽象的方法。

著录项

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号