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 分析和数据竞争检测的工具.
                    静态方法.静态方法聚焦于在不执行程序的情况下检测数据竞争,这样可以消除漏报                               [46,13,15,3336] .但是,由
                                                      [4]
                 于缺少运行时信息,误报很难避免.Polyvios等人 开发出的 LOCKSMITH是一个针对数据竞争的上下文敏感的
   129   130   131   132   133   134   135   136   137   138   139