论文标题

渐进的C0:逐渐验证的符号执行

Gradual C0: Symbolic Execution for Gradual Verification

论文作者

DiVincenzo, Jenna, McCormack, Ian, Gouni, Hemant, Gorenburg, Jacob, Ramos-Dávila, Jan-Paul, Zhang, Mona, Zimmerman, Conrad, Sunshine, Joshua, Tanter, Éric, Aldrich, Jonathan

论文摘要

当前的静态验证技术支持广泛的程序。但是,此类技术仅支持完整而详细的规格,这给用户带来了不适当的负担。为了解决此问题,先前的工作提出了逐步验证,该验证通过结合静态和动态检查来处理完整,部分或缺失的规格。逐渐验证也已扩展到操纵堆上递归,可变的数据结构的程序。不幸的是,随着规格的完善,此扩展名并未通过减少动态检查的用户奖励用户。实际上,无论有任何静态保证,都会动态检查所有属性。此外,到目前为止,尚无逐步验证的全面实施,这阻止了其在实践中的性能和适用性。 我们介绍渐进的C0,这是第一个可行的递归数据结构逐渐验证器,该核能数据结构针对C0,它是为教育设计的C0的安全子集。支持分离逻辑或隐式动态帧的静态验证符使用符号执行来推理;因此,扩展了一个这样的验证者的渐进C0采用符号执行,而不是先前工作中使用的最弱的自由前提方法。我们的方法解决了与象征性执行有关的技术挑战,并在计划声明和规范公式中都具有不精确的规格,所有权和分支。我们还应对与最小化动态检查的插入以及对C0之外其他编程语言的可扩展性有关的挑战。最后,我们提供了对逐渐验证者的首次经验性能评估,并发现与先前的工作中使用的完全动力学方法相比,平均而言,逐渐的C0在11-34%之间降低了运行时开销。此外,最糟糕的表现场景是可以预见的,并且可以避免。

Current static verification techniques support a wide range of programs. However, such techniques only support complete and detailed specifications, which places an undue burden on users. To solve this problem, prior work proposed gradual verification, which handles complete, partial, or missing specifications by soundly combining static and dynamic checking. Gradual verification has also been extended to programs that manipulate recursive, mutable data structures on the heap. Unfortunately, this extension does not reward users with decreased dynamic checking as specifications are refined. In fact, all properties are checked dynamically regardless of any static guarantees. Additionally, no full-fledged implementation of gradual verification exists so far, which prevents studying its performance and applicability in practice. We present Gradual C0, the first practicable gradual verifier for recursive heap data structures, which targets C0, a safe subset of C designed for education. Static verifiers supporting separation logic or implicit dynamic frames use symbolic execution for reasoning; so Gradual C0, which extends one such verifier, adopts symbolic execution at its core instead of the weakest liberal precondition approach used in prior work. Our approach addresses technical challenges related to symbolic execution with imprecise specifications, heap ownership, and branching in both program statements and specification formulas. We also deal with challenges related to minimizing insertion of dynamic checks and extensibility to other programming languages beyond C0. Finally, we provide the first empirical performance evaluation of a gradual verifier, and found that on average, Gradual C0 decreases run-time overhead between 11-34% compared to the fully-dynamic approach used in prior work. Further, the worst-case scenarios for performance are predictable and avoidable.

扫码加入交流群

加入微信交流群

微信交流群二维码

扫码加入学术交流群,获取更多资源