软件缺陷智能分析技术(2) - SZZ的基本流程
软件缺陷智能分析技术(2) - SZZ的基本流程
有了航海图之后,我们就从即时软件缺陷预测开始入手,先用最小的时间去预测下bug发生的可能性。
我们先复习下即时软件缺陷预测的地图:
SZZ算法
要做算法,首先需要有数据。标注数据的方法最早来自SZZ方法,来自论文《When Do Changes Induce Fixes?》,作者是斯里维尔斯基(Jacek Sliwerski), 齐默尔曼(Thomas Zimmermann)和泽勒(Andreas Zeller),取他们三个人姓的首字母,简称SZZ算法。
SZZ的框架分为4个主要步骤:
- 识别缺陷修的变更提交
- 从提交中识别出被修复的缺陷的代码
- 根据修复代码去识别可能引入缺陷的代码
-
噪音数据消除
SZZ算法框架
这么空对空地说有点抽象,我们举个例子。
识别缺陷修的变更提交
我们在github上可以找到issue列表,比如,下面是react库的:
react-issues
这里面的issue太多,我们把是bug的过滤出来,在搜索框中加入条件“is:issue is:closed label:"Type: Bug" ”:
react-issues-bugs
于是我们看到的就都是bug的列表了。
但是bug中还有不少的解决方案是重复问题的,有需要进一步信息的,有需要研究的,有状态未确定的,这些我们都要排除掉。
我们来一个高级搜索:
is:issue is:closed label:"Type: Bug" -label:"Resolution: Duplicate" -label:"Type: Needs Investigation" -label:"Status: Unconfirmed" -label:"Resolution: Needs More Information"
这回搜出来的质量就高很多了:
react-issue-bugs-fixed
识别bug对应的修改
我们随便找一个fixed issue去看下。
比如这个:https://github.com/facebook/react/issues/20932
我们往下翻,在其中找到相关的代码提交:
react-fix1
其对应的pull request是:https://github.com/facebook/react/pull/20948
然后我们找到对应的commit: https://github.com/facebook/react/pull/20948/commits/5daa2cfe01b879e42756d87b7fd3bdb9f9244edd
react-commit1我们记住这个文件名和行号:packages/react-reconciler/src/ReactFiber.new.js,
394行。我们运气还不错,遇上一个只有一行的。
根据修复代码去识别可能引入缺陷的代码
找到了这个提交还不够,我们还得去找到它的上一条提交。我们可以通过git log来查到这个提交:
git-log1.png找到这个提交号:c7b4497988e81606f1c7686434f55a49342c9efc。
然后我们切换到这个版本:
git checkout c7b4497988e81606f1c7686434f55a49342c9efc
接着我们就查看这一行是上次哪个版本引入进来的:
git blame packages/react-reconciler/src/ReactFiber.new.js
查到的结果如下:
git-blame-1
发现是1665443603这个提交引入的,我们来找一下这个提交:
commit 16654436039dd8f16a63928e71081c7745872e8f
Author: Andrew Clark <git@andrewclark.io>
Date: Fri Sep 4 16:34:07 2020 -0500
Rename effect fields (#19755)
- `effectTag` -> `flags`
- `subtreeTag` -> `subtreeFlags`
从中我们可以看到,这个提交是19755,我们如果想在github上查看这个提交可以通过https://github.com/facebook/react/pull/19755来查看。
这样,我们的一个SZZ的整个通路流程就完成了。
参考文献
SZZ的原始论文,它是2005年就有的了,那时候还在用CVS。
- J. Sliwerski, T. Zimmermann, and A. Zeller, “When do changes
induce fixes?” in ACM SIGSOFT Software Engineering Notes,
vol. 30, no. 4, ACM. ACM, 2005, pp. 1–5. [Online]. Available:
https://10.1145/1083142.108314