Page 134 - 《软件学报》2021年第7期
P. 134
2052 Journal of Software 软件学报 Vol.32, No.7, July 2021
的原因.第 1 个原因是外部函数中存在位置的访问类型(读和写).第 2 个原因在于复杂的线程创建和等待终止操
作.例如,我们发现一个程序在循环过程中创建一个线程列表,并通过按位和移位运算符连接这些线程.第 3 个原
因是我们将求解超时的约束当作是可满足的.
因此,对真实世界开源程序的评估肯定地回答了 RQ2 的问题,即 GUARD 在检测漏洞方面是有效的.此外,
对不同竞争检测工具的对比评估也回答了 RQ2——GUARD 能够以更低的误报率检测出其他工具报告的数
据竞争.
5.4 讨论以及未来工作
有效性威胁.对内在有效性的主要威胁与 GUARD 实现的正确性有关.为了减轻这种威胁,我们在工具构建
期间持续地对其进行测试.测试集包含 38 个回归测试用例以及 28 个实际应用程序.其中,38 个测试用例同时也
用于检验其可靠性.外部有效性威胁涉及到 GUARD 对其他编程语言的通用性以及缺陷数据集的质量.由于所
定义的线程模型是一个相对通用的模型,所以 GUARD 也能够基于当前线程模型扩展到其他编程语言,例如
Java.关于缺陷数据集的质量,由于目前没有找到满足本文实验的、权威的数据竞争缺陷数据集,所以我们使用
了 LDruid 和 LOCKSMITH 都使用的程序作为基准程序.基准程序中的数目、缺陷特征以及已知缺陷信息都会
影响缺陷检测工具的评估结果.所以,为了进一步保障评估的准确性,收集数据竞争缺陷也是未来工作之一.
相关警告.在实验中我们发现,尽管 GUARD 对于一些程序报告了很多警报,其中的一部分涉及的是相同的
变量.这是由于,可能存在两条以上的路径到达同一个数据访问对,在这种情况下,GUARD 根据这个数据访问对
会报告来自不同路径的警报.此外,另一种类型的相关警报是由访问相关联位置的一个变量引起的.例如,若一
个基本块中存在对一个变量的 2 次写访问,那么这个变量所对应的数据竞争会被重复识别 2 次.即使这些警报
的特征是相似的,开发者也必须手动检查这些相似警报.在理想状况下,开发者只需确认其中的一个,而不必每
个都进行检查.一种避免产生这两种警报的有效方式是使用警报集群(warning cluster).如果具有相似模式特征
的警报能被聚集起来,那么开发者只需检查其中一个典型的警报即可,从而可以避免在相似的警报上花费精力.
6 相关工作
本节调研 MHP 分析和数据竞争检测相关的方法.
MHP 分析.先前已有许多工作分析了 MHP 关系,特别是对于具有高级并发结构的语言,如 Java [21,22] 和
X10 [19,20,23] .此外,也有工作聚焦于其他语言 [8,14,31,32] .X10 拥有内置的高级并发结构,如 async、atomic 和 finish,
以此来简化并行程序的分析和优化.基于这种语言,Agarwal 等人 [19] 提出的一种 MHP 分析算法仅遍历 X10 程序
的程序结构树.Sanker 等人 [23] 对这种算法进行了扩展,通过一种对 MHP 条件的更高效的表示形式改善了计算复杂
度.Joshi 等人 [31] 提高了 MHP 分析的精度,通过对动态屏障间距的推理推断出语句间的顺序.Naumovich 等人 [22] 提
出了一种面向 Java 的使用数据流分析框架的 MHP 分析技术.该技术通过构建并行执行图(PEG)来表示 Java 并
发程序,并使用 PEG 推测不同指令间的 MHP 关系.Barik [21] 通过牺牲精度的方式换取效率,其采用的算法基于线
程创建树,从线程层面计算 MHP 关系.高层次并发结构的 MHP 分析简化了复杂性,最近的工作也分析了低层语
言中的 MHP 关系.Di 等人 [14] 通过分析局部关系图(RRG)计算 Pthreads 程序的 MHP 关系.RRG 是基于线程敏感
的 CFG 而构建的,具有相同 happens-before 性质的语句会被分到同一区域中.该工作只建模了 thread_create 和
[8]
thread_join.而 LDruid 方法通过静态地计算时钟向量来建立 happens-before 关系,并建模了 4 种线程操作
(thread_create、thread_join、thread_wait 和 thread_notify).与之相比,GUARD 建模了 6 种常见的线程操作.尽管
LDruid 声称使用了分离的锁集分析用于竞争检测,但它也引入了锁集分析所需的额外计算开销.上述方法背后
采用的主要思路与 GUARD 是相似的,即将 MHP 关系编码为专有结构体从而通过分析该结构体识别出两个语
句的 MHP 关系.但是,如果没有调用上下文信息和路径敏感分析,这些方法会产生更高的误报率.据我们所知,
GUARD 是第 1 个将上下文敏感和路径敏感应用于 MHP 分析和数据竞争检测的工具.
静态方法.静态方法聚焦于在不执行程序的情况下检测数据竞争,这样可以消除漏报 [46,13,15,3336] .但是,由
[4]
于缺少运行时信息,误报很难避免.Polyvios等人 开发出的 LOCKSMITH是一个针对数据竞争的上下文敏感的