软件缺陷智能分析技术(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
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
首先,需要根据激光功率和激光半径计算出激光强度I,并计算出岩石表面的吸收功率Pabs。根据题目给出的条件,可以得到: I = P / (π * w^2) = 1.91e7 W/m^2 Pabs = η * I = 1.15e7 W/m^2 接下来,需要利用有限差分法来求解温度和应力场。假设岩石的密度和比热容是均匀分布的,则可以根据热传导方程和连续性方程得到以下计算公式: dT/dt = K * (d^2T/dx^2 + d^2T/dy^2 + d^2T/dz^2) / (ρ * C) dSxx/dx = 2 * K * (d^2T/dx^2 - 1/3 * (d^2T/dy^2 + d^2T/dz^2)) dSyy/dy = 2 * K * (d^2T/dy^2 - 1/3 * (d^2T/dx^2 + d^2T/dz^2)) dSzz/dz = 2 * K * (d^2T/dz^2 - 1/3 * (d^2T/dx^2 + d^2T/dy^2)) 其中,dT/dt表示温度随时间的变化率,dSxx/dx、dSyy/dy、dSzz/dz分别表示应力场在x、y、z方向上的变化率,d^2T/dx^2、d^2T/dy^2、d^2T/dz^2表示温度在x、y、z方向上的二阶导数。 为了使用有限差分法进行求解,需要将岩石体划分为网格,根据题目给出的条件,可以将岩石体分为100个网格,每个网格的尺寸为0.1cm x 0.1cm x 0.1cm。可以通过以下代码生成网格: L = 10; % 岩石体长 W = 10; % 岩石体宽 H = 15; % 岩石体高 dx = 0.1; % 网格尺寸 dy = 0.1; dz = 0.1; nx = L / dx; % 网格数 ny = W / dy; nz = H / dz; x = linspace(0, L, nx); y = linspace(0, W, ny); z = linspace(0, H, nz); [X, Y, Z] = meshgrid(x, y, z); 接下来,需要设置初始温度场和边界条件。根据题目给出的条件,可以将初始温度设为300K,边界条件为第二类边界条件,即表面的温度梯度为0。可以通过以下代码设置初始温度场和边界条件: T = ones(nx, ny, nz) * 300; % 初始温度场 T(:, :, 1) = 300 + v * Pabs / (K * rho * C); % 底部边界条件 T(:, :, end) = 300; % 顶部边界条件 T(1, :, :) = T(2, :, :); % 左侧边界条件 T(end, :, :) = T(end-1, :, :); % 右侧边界条件 T(:, 1, :) = T(:, 2, :); % 前侧边界条件 T(:, end, :) = T(:, end-1, :); % 后侧边界条件 接下来,需要使用有限差分法来求解温度和应力场,可以通过以下代码实现: dt = 0.01; % 时间步长 Nt = 300; % 时间步数 for n = 1:Nt % 计算温度场 d2Tx = (T(3:end, 2:end-1, 2:end-1) - 2*T(2:end-1, 2:end-1, 2:end-1) + T(1:end-2, 2:end-1, 2:end-1)) / dx^2; d2Ty = (T(2:end-1, 3:end, 2:end-1) - 2*T(2:end-1, 2:end-1, 2:end-1) + T(2:end-1, 1:end-2, 2:end-1)) / dy^2; d2Tz = (T(2:end-1, 2:end-1, 3:end) - 2*T(2:end-1, 2:end-1, 2:end-1) + T(2:end-1, 2:end-1, 1:end-2)) / dz^2; dTdt = K * (d2Tx + d2Ty + d2Tz) / (rho * C); T(2:end-1, 2:end-1, 2:end-1) = T(2:end-1, 2:end-1, 2:end-1) + dt * dTdt; % 计算应力场 d2Txx = (T(3:end, 2:end-1, 2:end-1) - 2*T(2:end-1, 2:end-1, 2:end-1) + T(1:end-2, 2:end-1, 2:end-1)) / dx^2; d2Tyy = (T(2:end-1, 3:end, 2:end-1) - 2*T(2:end-1, 2:end-1, 2:end-1) + T(2:end-1, 1:end-2, 2:end-1)) / dy^2; d2Tzz = (T(2:end-1, 2:end-1, 3:end) - 2*T(2:end-1, 2:end-1, 2:end-1) + T(2:end-1, 2:end-1, 1:end-2)) / dz^2; Sxx = 2 * K * (d2Txx - 1/3 * (d2Tyy + d2Tzz)); Syy = 2 * K * (d2Tyy - 1/3 * (d2Txx + d2Tzz)); Szz = 2 * K * (d2Tzz - 1/3 * (d2Txx + d2Tyy)); end 最后,可以使用matlab的可视化工具来展示温度和应力场的分布情况。以下是一个简单的示例代码: figure; imagesc(squeeze(T(:, :, end/2))); colorbar; title('Temperature Distribution'); figure; quiver3(X, Y, Z, squeeze(Sxx), squeeze(Syy), squeeze(Szz)); title('Stress Field');
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jtag特工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值