Page 166 - 《软件学报》2025年第10期
P. 166
李志强 等: SZZ 误标变更对移动 APP 即时缺陷预测性能和解释的影响 4563
表 1 各 SZZ 实现算法概要
SZZ 描述 消除噪音类型 搜索策略
利用VCS中的注释命令识别修复缺陷的变更涉及
原始SZZ由Sliwerski等 缺陷修复涉及的所有代码行都被认为有
B-SZZ [12] 的所有修改代码行的最近一次变更, 将这些变更
人 提出 缺陷
标注为引入了缺陷的变更
去除空行、注释行和涉及代码格式修改 利用注释图记录源文件中代码行的修改过程, 再
Kim等 人 [13] 在 B-SZZ的
AG-SZZ 的非语义代码行, 其余代码行被视为有 对注释图进行深度优先搜索 (忽略噪音类型的代
基础上进行了改进
缺陷 码行), 识别引入了缺陷的变更
Da Costa等人 [14] 在AG- 去除非语义行和涉及元更改 (分支更改、在AG-SZZ的基础上, 识别缺陷的过程中忽略涉及
MA-SZZ
SZZ的基础上进行改进 合并更改以及文件属性更改)的代码行 元变更的代码行
Neto等人 [15] 在MA-SZZ 在MA-SZZ的基础上进一步去除涉及代 在MA-SZZ的基础上, 识别缺陷的过程中忽略涉及
RA-SZZ
的基础上进行了改进 码重构的行 代码重构的行
为解决上述问题, Mockus 等人 [29] 提出了代码变更级别的缺陷倾向性预测, 该粒度相比文件或模块更细化. 他
们构建了初始维护请求 (IMR) 的缺陷预测模型, 一个 IMR 由多个变更组成, 跟踪系统用于记录这些 IMR 的故障
记录, 以便于标注缺陷. Kim 等人 [30] 使用源代码变更日志构建缺陷预测模型, 用于识别多个开源软件项目是否存
在缺陷, 平均结果达到了 78% 的准确率和 60% 的召回率. Shihab 等人 [31] 面向工业软件项目建立变更级模型, 以预
测软件变更是否存在缺陷. 他们发现, 代码行与代码块的增加数量、被更改文件的缺陷倾向性、与变更相关的缺
陷报告数量以及开发人员的经验是识别代码变更有无缺陷的主要度量. 随后, Kamei 等人 [9] 利用上述技术建立缺
陷预测模型, 用于预测开发人员每次提交的代码变更是否引入了缺陷, 并将其称为即时软件缺陷预测. 具体地, 他
们收集了 11 个由 C/C++或 Java 编写的大型项目, 包括 6 个知名度较高的大型开源项目和 5 个大型商业项目, 根
据代码变更记录构建了 11 个数据集. 在此基础上, 采用逻辑回归分类器建立工作量感知模型 (EALR), 实验结果表
明该模型的平均召回率为 0.64, 在 20% 的工作量中识别出了 35% 的错误代码提交. 该研究为后续即时软件缺陷
预测提供了强有力的支撑.
在实际开发过程中, 为了在有限的时间和资源下帮助开发人员尽可能多的发现缺陷, 研究人员提出了工作量
感知 (effort-aware) 的概念 [32,33] . 工作量感知是指开发人员根据缺陷预测模型的结果, 通常只检查固定数量 (一般
为 20%) 的代码行所能发现的缺陷数量及占比, 以便更高效地发现潜在的缺陷变更, 并采取相应的措施进行修复.
Yang 等人 [34] 提出了一种基于单度量元排序的无监督工作量感知即时缺陷预测方法, 与多个有监督模型进行对比,
结果表明基于简单特征排序的无监督模型优于部分有监督模型. 随后, Liu 等人 [35] 提出基于代码 churn 的无监督工
作量感知排序模型. 在 Yang 等人工作的基础上, Fu 等人 [36] 提出了一种名为 OneWay 的工作量感知即时缺陷预测
方法. OneWay 首先使用 Yang 等人 [34] 的无监督模型来训练数据, 选择具有最佳工作效率的模型, 然后应用于待测
数据并对其结果进行优先级排序. 此后, Huang 等人 [37] 提出了一种分类先于排序的工作量感知即时缺陷预测方法,
称为 CBS+. 该方法集成了无监督模型 LT 与有监督模型 EALR 的思想, 在 7 个开源项目上进行实验, 相比 LT 和
EALR, 所提出的有监督模型具有更高的预测精度. Chen 等人 [38] 采用多目标优化算法用于即时缺陷预测, 提出
MULTI 模型. 其中一个目标旨在最大化识别缺陷变更的数量, 另一个目标旨在最大程度减少代码审查的工作量.
结果表明 MULTI 在 Popt 和 Recall@20% 指标上优于对比方法. 最近, Li 等人 [39] 提出一种工作量感知的 tri-training
半监督即时缺陷预测方法, 实验结果表明所提出的模型在不同的标注比率上优于基线模型. 此外, 还有一些即时缺
陷预测研究 [40,41] 在专有和 JavaScript 项目上实证比较有监督与无监督模型的性能.
随着深度学习技术的快速发展, 它在各个领域都展现出了巨大的潜力和广泛的应用前景. 深度学习模型以其
强大的自动特征提取和模式识别能力, 也开始被应用于软件缺陷预测中 [42−44] . Yang 等人 [45] 采用深度置信网络用
于即时缺陷预测, 首先, 传统人工设计的特征被输入到网络中以学习深度特征表示, 然后, 来预测未知的代码变更.
与基线模型相比, 获得了较好的预测性能. Hoang 等人 [46] 提出了一种端到端的深度学习框架 (DeepJIT), 可从提交
信息和代码变更中自动学习深度特征, 结果表明 DeepJIT 优于最先进的基线模型. 随后, 他们采用基于分层注意力
网络的深度学习框架学习添加和删除代码的分布式向量表示, 由其附带的日志信息进行引导, 提出了一种 CC2Vec

