基于SMT的Px86程序持久性不变式验证
1. 引言
非易失性内存(NVM)技术能为需要持久化数据的应用带来显著的性能提升,因为程序可以通过向映射到NVM的地址写入数据来实现数据持久化。然而,内存写入操作具有复杂的持久性语义,通常既不同步持久化,也不按程序顺序持久化,除非程序员在适当的程序点插入特殊的栅栏和缓存行刷新指令。
由于这些指令成本较高,程序员往往插入的栅栏数量不足,这可能导致在电源故障时数据损坏,从而抵消了NVM的优势。目前,虽然有一些工具可以帮助程序员进行栅栏/刷新指令的放置,但它们往往为了可扩展性而牺牲了精度和/或可靠性。例如,Jaaru是一个无状态模型检查器,它不会详尽地探索所有程序执行路径,因此无法用于证明程序中不存在错误;静态分析方法假设所有适当注释的数据都将被刷新,这需要许多冗余的刷新指令;动态分析(测试)方法虽然可以达到一定精度,但只能在实际探索的执行路径上提供正确性保证,不能证明程序中不存在错误。
本文提出了一种自动化方法,用于证明并发有界(无循环)NVM程序持久状态的不变式,该方法会探索并发和持久性所引发的整个状态空间。具体采用符号模型检查方法,将程序、其语义和规范编码为一个逻辑公式,当且仅当程序不正确时该公式可满足,然后使用SMT(可满足性模理论)求解器检查其可满足性。
2. 预备知识
2.1 公理内存一致性模型
公理内存模型将程序的语义定义为一组满足特定一致性谓词的执行图。这些图的节点称为事件,代表单个内存访问或栅栏的执行。形式上,一个事件 $e \in Event$ 是一个形如 $\langle i, t, lab \rangle$ 的元组,其中 $i \in N$ 是唯一的事件标识符,$t \
超级会员免费看
订阅专栏 解锁全文


被折叠的 条评论
为什么被折叠?



