Page 131 - 《软件学报》2021年第7期
P. 131

高凤娟  等:高精度的大规模程序数据竞争检测方法                                                        2049


                 局变量以函数参数在函数调用之间传播的方式,使得被调用者的分析结果能够包括全局变量.以这种方式,通过
                 分析函数参数来分析全局变量,统一并简化了分析过程.
                    简化的 source-sink 模式.为数据竞争检测所设计的 source 和 sink 是对变量的读写访问操作.但是,由于读-
                 读访问并不会导致数据竞争,所以这样的设计模式会导致冗余分析.为了避免多余的分析,GUARD 实际上将
                 source 设为写操作而将 sink 设为读或写操作.这样,如果一个 source 是写而 sink 是读,就不必检查 source 和 sink
                 的顺序.朴素的 source-sink 模式会检查 source 和 sink 的顺序,否则,当一个访问是写而另一个访问是读时就会报
                 告两遍警告.所以,改进后的 source-sink 模式能够减少分析变量的数量以及检查 source 和 sink 顺序的时间.
                 4.2   程序中的循环
                    由于本文方法需要为两个分析步骤收集路径约束(即 MHP 查询和 source-sink 检测),必须使得两个分析步
                 骤中的约束条件保持一致.然而,当分析一个循环时,线程标签流难以确定循环执行的次数.尽管通过对 TFG 应
                 用转换规则能够使得 MHP 分析到达不动点,但是,由于整体分析需要结合 MHP 分析和基于 source-sink 的值流
                 分析,计算 MHP 的定点会存在两部分路径不一致的问题.例如,有可能出现 MHP 分析中经过 2 次某个循环但是
                 source-sink 则是 3 次该循环.因此,尽管 GUARD 的线程流分析和检测框架能够将各个循环分开分析,我们还是
                 采取了一个折中方案,即将一个循环展开 2 次,以此达到两个目的:(1)  避免计算定点;(2)  避免不一致的路径约
                 束.此外,根据 Saturn [30] 和 Pinpoint [17] 等工具,在基于约束条件的分析过程中,展开循环是可行的,并且将循环展开
                 2 次是权衡精度和效率的常用举措.

                 5    实验评估

                    为了对 GUARD 进行评估,我们考虑如下研究问题.
                    RQ1:GUARD 检测数据竞争的效率如何?
                    RQ2:GUARD 检测数据竞争的有效性如何?
                    RQ1 评估 GUARD 方法的性能表现,RQ2 就检测到的数据竞争数量、其减少误报率的能力对 GUARD 方
                 法的有效性进行评估.RQ1 和 RQ2 也能评估 GUARD 和其他工具相比总体性能的差异.本文实验选取 4 种可以
                                                         [6]
                                                                       [4]
                                                                                          [8]
                                                                                [5]
                 公开获得的前沿的静态数据竞争检测工具:Relay 、LOCKSMITH 、Goblint 和 LDruid .其中,Relay 和
                 LOCKSMITH 是经典数据竞争检测工具,Goblint 和 LDruid 是近期提出的技术,其中,LDruid 同样采用了 MHP
                 分析.所有这些工具都是上下文敏感和流敏感的,且 Goblint 额外支持路径敏感的分析,这是为了处理在分支中
                 的锁操作或可能失败的加解锁操作.相比之下,GUARD 是上下文、流、路径敏感的.
                    所有实验都在 Ubuntu 16.04、Intel Core i7-8700k 处理器、32GB 物理内存条件下完成.该实验将每个
                 程序的检测时限设为 1 小时.此外,无法在限定时间内求解的约束条件会被视为可满足的.这是为了避免漏
                 报,因为 GUARD 会丢弃不可行路径,如果将超时约束视为不可满足会导致相应的路径被丢弃,从而可能引
                 入漏报.

                 5.1   评估对象
                    由于 GUARD 需要待测程序的源代码,因此随机选取 Github 中比较流行的开源项目作为评估对象.这些项
                 目涵盖,如下载工具、文件系统、数据库等不同的领域.具体信息见表 1.在选定评估对象后,使用 GUARD 对它
                 们进行分析.最后通过人工查验报告统计其效率和有效性.表 1 列出了被测程序的相关信息,第 1 列和第 2 列分
                 别代表它们的名称和规模,最后两列则是被测程序的描述和源码地址.
                    为了保证公平性,我们不把通过 GUARD 检测出来的数据竞争的项目(即表 1)作为基准去评估其他工具的
                 效果.所以,用于比较的基准程序是基于 LDruid 和 LOCKSMITH 所提供的 7 个程序.如果分析过程在 1 小时内
                 未完成,则被认为超时.如果警报总数小于 100,我们就会手动确认数据竞争警报.否则,随机从中选取 100 个进行
                 确认.实验结果已经公开在 figshare 中(https://figshare.com/articles/GURAR-Experiment/9724055).
   126   127   128   129   130   131   132   133   134   135   136