Page 165 - 《软件学报》2025年第10期
P. 165
4562 软件学报 2025 年第 36 卷第 10 期
Commit: 292c9bf15
日期: 5/14/2021 --- AudioPlayerFragment.java
Step 4: 噪音数据消除 提交内容: New media player screen Step 3: 识别可能引入缺陷的变更 +++ AudioPlayerFragment.java
--- AudioPlayerFragment.java -----------------------------------------------
+++ AudioPlayerFragment.java - if (media.getChapters() != null){
----------------------------------------------- + if (media.getChapters() != null &&
!media.getChapters().isEmpty()){
+ if (media.getChapters() != null){
引入缺陷的变更
Step 2: 识别被修复的
缺陷代码
Commit: 05606507b
Step 1: 识别缺陷修复变更 日期: 6/15/2021
提交内容: Fix for highlighted seek bar
on episode without chapters
修改文件: AudioPlayerFragment.java
Git 仓库
图 1 原始 SZZ 算法识别缺陷的一次示例
1.1.2 基于注释图的 SZZ 算法 (annotation graph SZZ, AG-SZZ)
Kim 等人 [13] 发现使用 B-SZZ 算法进行数据标注会产生大量噪音, 有相当多的变更被错误识别为引入了缺陷,
并且 B-SZZ 将注释行、空白行和格式修改 (如代码缩进) 等非语义行的修改错误识别为有缺陷. 事实上这些非语
义代码行并不会引入缺陷, 然而 B-SZZ 算法未考虑与此. 特别是在 B-SZZ 算法的 Step 3 中, B-SZZ 错误地将涉及
格式修改的代码识别为有缺陷. 因此, 格式修改的代码行可能会影响 B-SZZ 结果的正确性. 为了解决上述问题,
Kim 等人提出了 AG-SZZ. 在 B-SZZ 算法 Step 3 中使用注释图 [26] 来溯源代码, 相比注释命令, 注释图可以提供更
全面的代码修改信息 (例如增加和删除代码行).
1.1.3 基于元变化感知的 SZZ 算法 (meta-change aware SZZ, MA-SZZ)
Da Costa 等人 [14] 发现, 如果 B-SZZ 算法 Step 3 中涉及元更改 (分支更改、合并更改以及文件属性更改), 则会
将代码的元更改识别为引入缺陷, 然而元更改并不属于代码缺陷, 不会对项目造成影响, 而 AG-SZZ 仍然会将其识
别为引入了缺陷的变更. 由于 AG-SZZ 存在上述问题, Da Costa 等人 [14] 在 AG-SZZ 的基础上进行了改进, 提出基
于元变化感知的 SZZ 算法, 即 MA-SZZ. 通过改进 AG-SZZ 中的注释图, 从而避免将元更改识别为代码缺陷.
1.1.4 基于代码重构感知的 SZZ 算法 (refactoring aware SZZ, RA-SZZ)
Neto 等人 [15] 观察到, 先前的 SZZ(B-SZZ、AG-SZZ 和 MA-SZZ) 算法会将重构代码行 (例如对函数名的修改)
识别为缺陷. 重构行会影响 SZZ 算法的 Step 2 和 Step 3, 其并不属于缺陷范畴, 所以在 Step 2 中应过滤掉重构行,
在 Step 3 中溯源缺陷代码时, 重构行会被作为缺陷进行溯源, 从而无法识别出正确的引入缺陷的更改. 为应对上述
挑战, Neto 等人 [15] 提出了基于代码重构感知的 SZZ, 他们在 MA-SZZ 的基础上集成了一种名为 RefDiff 的 Java 代
码重构检测工具 [27] , 通过该工具对代码行进行进一步筛选和处理, 不再将重构的代码行视为缺陷.
在 SZZ 识别引入缺陷的变更过程中, 这 4 种 SZZ 算法都需执行如图 1 所示的 4 个步骤. 它们相同之处在于识
别修复了缺陷的变更 (Step 1) 和去除掉不正确的引入缺陷的变更 (Step 4). 而不同之处在于, 识别缺陷代码行 (Step 2)
和识别引入了缺陷的变更 (Step 3) 时使用了不同的搜索策略. 4 种 SZZ 算法的概述参见后文表 1. 其中, 消除噪音
的方法对应 SZZ 的 Step 2, 在修复缺陷的变更中识别出真正含有缺陷的代码行. 搜索策略应用于 SZZ 的 Step 3, 在 Step 2
的基础上进行回溯, 识别出引入了缺陷的变更.
1.2 即时软件缺陷预测
传统缺陷预测技术主要用于预测文件或模块的缺陷倾向性, 属于较粗粒度的软件实体. 然而粗粒度的预测模
型可能会将包括数千行代码的文件识别为缺陷 [28] , 开发人员在此基础上检查并修复缺陷的工作量过于庞大. 此外,
一个文件可能经由多个甚至上百个开发人员修改, 很难找出引入了缺陷的开发人员.

