软件缺陷智能分析技术(3) - 提升SZZ的准确率

2021-03-18  本文已影响0人  Jtag特工

软件缺陷智能分析技术(3) - 提升SZZ的准确率

上一节我们介绍了在即时缺陷分析领域里有开创意义的SZZ算法。尽管用直觉都能感受到SZZ算法有诸多需要改进之处,但是目前这仍然是即时缺陷分析的基础方法。

这一节我们就讨论如何提升SZZ算法的准确率。

细看SZZ

首先我们复习一下SZZ算法的内容:

在开发过程中,有可能开发者不是一次性提交的。SZZ论文中考虑到了这种情况,针对同一个人使用同一commit message,在相近的时间的提交,将整合到一组中,这叫做滑动窗口技术。

通过提交信息,我们可以以较低的精度获取一部分bug fix提交的信息。如果要提升精度的话,我们需要从缺陷管理系统如JIRA, bugzilla等中获取更详细的信息。

SZZ的论文从语法和语义两方面来提升准确率。

首先从语法方面,针对提交信息去猜测与bug的关联。
具体来说,针对bug+数字,bug系统的链接以及纯数字,如:

获取到了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算法的最重要的一步。

参考文献

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
上一篇下一篇

猜你喜欢

热点阅读