摘要
Findbugs 等自动静态分析工具 (ASAT) 的误报率很高。产生的大量误报构成了采用的障碍。研究人员建议使用机器学习来消除误报,并仅向开发人员提供可操作的警告。最先进的研究已经根据对文件、代码和警告的特征和历史计算的指标确定了一组“黄金特征”。最近的研究表明,使用这些特征的机器学习非常有效,并且它们达到了几乎完美的性能。
我们进行了详细分析,以更好地了解“黄金特征”的强劲表现。我们发现,一些研究使用了导致数据泄漏和数据重复的实验程序,这些都是具有重大影响的微妙问题。首先,ground-truth 标签已经泄露到特征中,这些特征衡量了给定上下文中可操作警告的比例。其次,测试数据集中的许多警告出现在训练数据集中。接下来,我们展示了确定真实标签的警告预言的局限性,这是一种将给定修订版中的警告与未来参考修订版进行比较的启发式方法。我们展示了参考修订的选择会影响警告分布。此外,启发式产生的标签与人类预言不符。因此,如果在实践中采用,以前看到的这些技术的强大性能对其真实性能过于乐观。我们的结果传达了几个教训,并为评估误报检测器提供了指导。
关键词:静态分析、误报、数据泄露、数据重复
引言
自从 Findbugs [5] 被引入来检测 Java 程序中的错误以来已经 15 年了。与其他自动静态分析工具(ASAT)[8, 41, 43] 一起,FindBugs 旨在通过将代码与错误模式 [5, 18] 匹配来检测不正确的代码,例如,可能取消引用空指针的代码模式。从那时起,许多项目都采用了这些工具,因为它们有助于以低成本检测错误。但是,这些工具不能保证警告是真正的错误。由于有效误报的高发生率 [19,43,52],许多开发人员不认为 ASAT 的警告是相关的。先前的工作表明,误报率可能高达 91%。虽然静态分析的过度逼近(overapproximation)可能会导致误报,但误报不仅指分析错误或过度逼近,还包括开发人员未采取行动的警告 [19,43,44]。如果开发人员认为警告不代表错误或认为修复风险太大,他们可能不会对警告采取行动。
为了解决误报率高的问题,许多研究人员 [15, 53] 提出了修剪误报和识别可操作警告的技术,这些警告是开发人员将修复的警告。这些方法 [12, 13, 23, 25, 27, 42, 45, 55, 59] 考虑了 Findbugs 在项目中报告的警告的不同方面,包括有关源代码的因素 [12]、存储库历史 [55]、文件特征 [29, 59],以及有关修复项目中 Findbugs 警告 [27] 的历史数据。王等人 [53] 完成了对文献中提出的特征的系统评估,并确定了 23 个“黄金特征”,这是检测可操作 Findbugs 警告的最重要特征。使用这些特征,随后的研究 [56-58] 表明,任何机器学习技术,例如 SVM,执行有效,并且使用少量训练实例可以训练有效的模型。在这些研究中,可以实现高达 96% 的召回率和 98% 的准确率以及 99.5% 的 AUC。一个完美的预测器具有 100% 的召回率、精度和 AUC,这表明使用黄金特征的机器学习技术几乎是完美的。
尽管黄金特征已被证明表现良好,但我们不知道它们为何有效。因此,在这项工作中,我们寻求更深入地了解黄金特征。我们发现了一些问题:首先,真实标签被泄露到了测量给定上下文中可操作警告比例的特征中。其次,将测试数据中的警告用于训练。为了了解它们的影响,我们解决了这两个缺陷,发现 Golden Features 的性能有所下降。我们的结果表明,黄金特征的使用并没有大大优于预测所有警告都是可操作的稻草人基线。
接下来,我们研究在构建数据集时用于获取真实标签的警告预言。为了评估任何提议的方法,应该构建一个大型数据集,其中每个警告都被准确地标记为可操作警告或误报。许多研究 [53, 56, 58] 使用启发式(我们称之为封闭警告启发式,closed-warning heuristic)作为警告预言来确定警告的可操作性,检查参考修订中是否报告了相同的警告,修订后按时间顺序排列测试修订。如果文件仍然存在并且参考修订中未报告警告,则警告将关闭并假定已修复。因此,它被认为是可行的。相反,保持打开状态的警告是误报。将在实验设置的模拟时间后几年进行的修订用作参考修订。先前的研究 [53, 56, 58] 选择了在测试修订后 2 年设置的参考修订。然而,之前的工作没有研究过启发式的鲁棒性。
警告预报有几个理想的品质。首先,它应该允许构建足够大的数据集。其次,它应该是可靠的;标签应该对 oracle 中的微小变化具有鲁棒性。第三,它应该生成人类注释者和使用 ASAT 的项目的开发人员同意的标签。封闭警告启发式的一个优点是它可以构建大型数据集。然而,我们的实验表明,鉴于参考修订版本的选择发生了变化,标签缺乏一致性。这可能允许从实验中得出不同的结论。我们的实验还发现,预言机并不总是产生人类注释者或开发人员同意的标签。这些限制表明,仅凭启发式方法并不总能产生值得信赖的标签。在删除未经确认的可操作警告后,Golden Features SVM 的有效性得到了提高,表明了干净数据的重要性。
最后,我们强调从我们的实验中吸取的教训。我们的结果表明需要仔细设计一个实验程序来评估未来的方法,并将它们与适当的基线进行比较。我们的工作指出了在设计用于构建基准的警告预言时面临的开放挑战。根据吸取的经验教训,我们概述了未来工作的几项指导方针。
我们做出以下贡献:
- 我们分析了使用先前研究中观察到的“黄金特征”的强劲表现的原因。与之前的工作相反,我们发现机器学习技术并非近乎完美,并且该领域未来的工作仍有很大的改进空间。
- 我们研究警告预言,即封闭警告启发式,它为先前研究中使用的警告分配标签。我们表明启发式可能不够稳健。
- 我们讨论经验教训及其影响。重要的是,我们强调需要社区努力建立准确的基准,并建议未来的研究将新方法与稻草人基线进行比较。
本文的其余部分的结构如下。第 2 节介绍了我们工作的背景。第 3 节介绍了研究的设计。第 4 节分析黄金特征。第 5 节研究封闭警告启发式。第 6 节讨论了从我们的研究中吸取的教训。第 7 节介绍了相关工作。最后,第 8 节总结了本文。
背景
自动静态分析工具
区分可操作的警告和误报
学习规划
研究问题
RQ1:为什么黄金特征有效?
RQ2:封闭式警告启发式作为警告预言机有多合适?
评估设置
黄金特征分析
封闭警告启发式分析
选择不同的参考版本
未经证实的可操作警告
未经证实的误报
讨论
得到教训
对有效性的威胁
相关工作
结论和未来的工作
在这项研究中,我们表明从自动静态分析工具检测可操作警告的问题远未解决。在之前的工作中,“黄金特征”的强劲表现是由数据泄漏和数据重复问题促成的,这些问题微妙且难以检测。
我们的研究强调了对警告预言进行更深入研究以确定真实标签的必要性。通过更改参考版本,可以得出关于黄金特征性能的不同结论。此外,oracle 会产生人工注释者和使用静态分析工具的项目开发人员可能不同意的标签。我们的实验表明,Golden Features SVM 在更清洁的数据上提高了性能。
我们的研究表明了未来工作的机遇和挑战。它强调了社区需要努力建立一个大而可靠的基准,并将新提出的方法与稻草人基线进行比较。该链接提供了一个复制包:https://github.com/soarsmu/SA_retrospective