摘要
由于线程交错的数量很大,分析多线程程序是困难的。偏序关系可用于建模和分析多线程程序。然而,目前尚无专用的决策过程用于解决偏序约束。在本文中,我们提出了一种新颖的有序一致性理论,用于在顺序一致性下验证多线程程序,并详细阐述了其理论求解器。该求解器实现了增量一致性检查、最小冲突子句生成和专用理论传播,以提高 SMT 求解的效率。我们在可信赖的基准测试上进行了大量实验,结果显示我们的方法显著提升了性能。
作者:清华大学软件学院 贺飞、Zhihang Sun、Hongyu Fan
Introduction
现在的计算系统中普遍使用共享内存多线程程序。并发程序的交错数量使得其在实践中很难进行验证。因此,开发技术来缓解并发程序验证中的执行爆炸问题是非常有意义的。
内存一致性模型[6]限制了来自不同线程的共享内存访问的执行顺序。它确定了读取访问可能返回的值。在本文中,我们遵循众所周知的顺序一致性(SC)模型[42],其中执行路径是来自不同线程的指令的交错。
对于验证多线程程序,一种有希望的技术是使用有界模型检测[16, 19],其中使用偏序关系来表示共享内存访问事件之间的 happens-before 关系[10, 11]。通过这种方式,可以指定多线程程序的不确定和复杂的交错行为。
一种常见的解决偏序约束的方法(例如[9–11, 50, 56])是基于整数差分逻辑。每个事件与一个整数值时钟相关联,事件的顺序表示为这些时钟变量之间的差异。然后,可以使用整数差分逻辑的决策过程来解决偏序约束。这种方法为每个事件确定一个时钟值,这可能过于远大,因为我们只关心事件的顺序,而不关心它们的精确时钟值。
此外,在推理多线程程序时存在一个重要的公理(第 4 节中的公理 2),它定义了所谓的从读取顺序的推导规则。现有的方法[9–11, 29, 50]编码了所有可能的从读取约束,无论这些约束是否实际上需要进行验证。这种方法会产生大量的从读取约束,显著增加了求解器的负担并降低了其性能。
在本文中,我们提出了一种新颖的有序一致性理论(
我们为
最后但同样重要的是,受到单元子句传播思想的启发,我们提出了一种新颖的理论传播技术。我们尝试使用这种技术找到所谓的单元边,并使用这些边来强制一些未赋值的变量的取值(见第 5.4 节)。这样,DPLL(T)的决策迭代可以大大减少,并且整体性能得到显著提高。
我们在 CBMC [41]和 Z3 [23]中实现了所提出的方法,并在 SVCOMP 2019 的 ConcurrencySafety 类别中的 1061 个可信基准上进行了实验。我们将我们的方法与最先进的并发验证工具进行了比较,包括 CBMC [10]、Lazy-CSeq [36]、CPA-Seq [14, 15]和 Dartagnan [28]。相比于 CBMC、CPA-Seq 和 Dartagnan,我们的方法分别解决了更多的 38、119 和 897 个案例,比 Lazy-CSeq 少解决了 6 个案例。在解决了这些案例的基础上,与 CBMC、CPA-Seq、Dartagnan 和 Lazy-CSeq 相比,我们的方法运行速度分别提高了 2.33 倍、90.04 倍、139.47 倍和 7.20 倍,内存消耗分别减少了 18.7%、99.6%、99.0%和 94.5%。
我们还将我们的方法与最先进的无状态模型检测工具 Nidhugg/rfsc[4]和 GenMC [39]进行了比较,使用了 Nidhugg 套件中的 9 个基准。实验结果表明,随着程序规模(以轨迹数量衡量)的增加,我们的方法在大多数情况下优于这些工具。
总结起来,我们的主要贡献如下:
- 我们提出了一种新的适用于多线程程序验证的有序一致性理论
。 - 我们详细介绍了一种高效的
理论求解器,它实现了增量一致性检查、最小冲突子句生成和专门的理论传播,以提高 SMT 求解的效率。 - 我们在 CBMC 和 Z3 中实现了我们的方法。对 SV-COMP 并发基准进行的实验表明,我们的方法相比于最先进的工具有数量级的改进。
本文的其余部分组织如下。第 2 节介绍了一些背景知识。第 3 节展示了我们对多线程程序的符号编码。第 4 节提出了新的 $\mathcal{T}{ord}
Preliminaries
Notions
在一阶逻辑中,术语是一个变量、一个常量,或一个
一个一阶理论
Satisfiability Modulo Theory and
理论满足性模型问题(SMT)[12, 23, 24] 是一个决策问题,用于一些一阶背景理论组合的公式。对于每个背景理论
理论求解器可以以在线或离线方案与
并发执行作为部分顺序
我们的方法基于 Alglave 等人的框架[10],该框架使用部分顺序来建模并发执行。一个事件
: 的类型,即如果 是写访问,则为 ;如果 是读访问,则为 。 : 访问的内存地址。 :使 可用的守卫条件。
设
此外,给定一对写事件
一个执行是有效的,如果