软件缺陷智能分析技术(3) - 提升SZZ的准确率
上一节我们介绍了在即时缺陷分析领域里有开创意义的SZZ算法。尽管用直觉都能感受到SZZ算法有诸多需要改进之处,但是目前这仍然是即时缺陷分析的基础方法。
这一节我们就讨论如何提升SZZ算法的准确率。
细看SZZ
首先我们复习一下SZZ算法的内容:
- 第一步,从bug数据库中找到修复的问题
- 第二步,从代码库中找到bug修复的代码改动
- 第三步,针对每一行改动,找到之前的版本中修改这处代码的提交,这个提交在原论文中被称为fix-inducing
在开发过程中,有可能开发者不是一次性提交的。SZZ论文中考虑到了这种情况,针对同一个人使用同一commit message,在相近的时间的提交,将整合到一组中,这叫做滑动窗口技术。
通过提交信息,我们可以以较低的精度获取一部分bug fix提交的信息。如果要提升精度的话,我们需要从缺陷管理系统如JIRA, bugzilla等中获取更详细的信息。
SZZ的论文从语法和语义两方面来提升准确率。
首先从语法方面,针对提交信息去猜测与bug的关联。
具体来说,针对bug+数字,bug系统的链接以及纯数字,如:
- bug[# \t]*[0-9]+,
- pr[# \t]*[0-9]+,
- show_bug.cgi?id=[0-9]+, or
- [[0-9]+]
获取到了bug号之后,我们还要到bug系统中去验证。这就是语义部分。我们希望确认以下事情:
- 此bug存在
- 此bug的状态是fixed
- 此bug分配给的人与代码的提交者是同一个人
- bug中的信息跟代码中修改的文件相关
当我们确认了修改和bug之间的关系后,我们就可以针对改动的每一行进行git blame去查找对应的改动了。
SZZ算法的改进
SZZ算法在实践中,还是发现了很多问题的。
比如SZZ第三步,针对每一行代码去查最近一次改动的提交。听起来很有道理,但是到真的代码中去查看,就发现,这里面有空行,有注释,也有格式上的改动。按照原始版本的SZZ算法,这些噪声都没有消除,所以就会带来大量的误报。
解决方案也很简单,把空行、注释这些都过滤掉就好了。
唯一有点技术含量的是识别格式整理这样的操作,这个需要一个叫Annotation Graph的工具,由SZZ中的两个Z参与,论文为《Mining version archives for co-changed lines》。
下面是Annotation Graph的示意图:
cochange
如果更进一步,不只是格式整理,而是代码重构呢?这时需要识别代码重构的工具,比如针对Java的RefDiff,或者是针对多种语言的RefDiff 2。
支持重构之后的SZZ,叫做refactoring aware SZZ,简称RA-SZZ.
下面是RA-SZZ的示意图:
RA-SZZ
RefDiff的原理是采用了AST进行对比的方式:
RefDiff
随着ci/cd的不断流行,现在的软件库的版本也越来越多,这就产生了大量的元数据的变化导致的噪声。这些大部分都是配置管理操作,比如创建分支、合并分支等。于是Da Costa等人提出了Meta-change aware SZZ。
下面的图很好地总结了上面讲的主要流程:
MA-SZZ
Step 2的bug report和bug fix链接对的质量是影响SZZ算法的最重要的一步。
参考文献
- Zimmermann T, Kim S, Zeller A, Jr. Whitehead EJ. Mining version archives for co-changed lines. In: Proc.of the 3rd Working
Conf. of Mining Software Repositories. New York: ACM Press, 2006. 72−75. - Kim SH, Zimmermann T, Pan K, Jr. Whitehead EJ. Automatic identification of bug-introducing changes. In: Proc. of the 21st Int’l
Conf. on Automated Software Engineering. Washington: IEEE, 2006. 81−90. - Da Costa DA, McIntosh S, Shang W, Kulesza U, Coelho R, Hassan AE. A framework for evaluating the results of the SZZ
approach for identifying bug-introducing changes. IEEE Trans. on Software Engineering, 2017,43(7):641−657. - Neto EC, Da Costa DA, Kulesza U. The impact of refactoring changes on the SZZ algorithm: An empirical study. In: Proc. of the
25th Int’l Conf. on Software Analysis, Evolution and Reengineering. Washington: IEEE, 2018. 380−390. - D. Silva and M. T. Valente, “Refdiff: detecting refactorings in version
histories,” in Proceedings of the 14th International Conference on
Mining Software Repositories. IEEE Press, 2017, pp. 269–279.
网友评论