RGSep动作推理:用于细粒度并发堆操作程序的自动验证
1. 引言
底层C语言程序员经常依赖两种容易出错的编程特性:手动内存管理( malloc/free )和并发。虽然有一些验证技术可以单独处理这两个特性,但很少有技术能够同时处理使用这两种特性的程序。
RGSep是依赖保证推理的扩展,结合了分离逻辑。它使用依赖(rely)和保证(guarantee)这两个二元关系来描述共享状态的更新。线程的依赖关系低估了它能容忍的来自环境的干扰,而保证关系则高估了线程能进行的更新,即它对并发环境造成的干扰。RGSep将这些二元关系表示为一组动作的自反和传递闭包,这些动作是描述可能的小更新的前置条件 - 后置条件对。
以往,用户需要手动使用RGSep的证明规则来证明程序的正确性,这既繁琐又容易出错。本文将之前的半自动化工作扩展为完全自动化,提出了Infer - Actions算法,该算法将依赖和保证关系计算为一组动作,每个动作都扩展了一个特殊的上下文断言,描述不受动作影响的状态部分。在推理这些动作的过程中,算法还能证明内存安全性、发现形状不变式并验证用户提供的断言。
2. 预备知识
2.1 程序语言
考虑一阶C语言子集的程序,程序由初始化阶段和可能无限数量的线程的顶级并行组合组成。程序命令包括空命令、变量赋值、内存加载和存储、内存分配、假设语句、顺序组合、非确定性选择、循环和原子命令。重要的是,中间语言中内存访问的原子性是显式的,默认情况下内存访问是非原子的,当内存访问由内存模型保证为原子时(如对易失性变量或字段的单字内存访问),将其包含在原子块中。
超级会员免费看
订阅专栏 解锁全文

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



