美文网首页
软件缺陷智能分析技术(2) - SZZ的基本流程

软件缺陷智能分析技术(2) - SZZ的基本流程

作者: Jtag特工 | 来源:发表于2021-03-17 21:23 被阅读0次

    软件缺陷智能分析技术(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

    react-pr1

    然后我们找到对应的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。

    1. 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

    相关文章

      网友评论

          本文标题:软件缺陷智能分析技术(2) - SZZ的基本流程

          本文链接:https://www.haomeiwen.com/subject/mhmoqltx.html