《Science of Computer Programming》:An empirical study of neural network based graph representations for software defect prediction
编辑推荐:
•对基于神经网络的图表示方法在缺陷预测模型性能上的影响进行了实证研究。•针对7个基准数据集的15个版本,对比了6种程序图在4种图神经网络中的表现,用于项目内部和跨项目缺陷预测。•为研究人员和实践者提供了提升软件缺陷预测模型可靠性和适用性的实用指导。引言随着软件系统规模和复杂度的不
- •
对基于神经网络的图表示方法在缺陷预测模型性能上的影响进行了实证研究。
- •
针对7个基准数据集的15个版本,对比了6种程序图在4种图神经网络中的表现,用于项目内部和跨项目缺陷预测。
- •
为研究人员和实践者提供了提升软件缺陷预测模型可靠性和适用性的实用指导。
引言
随着软件系统规模和复杂度的不断上升,人们对软件质量、可靠性及可信度的要求也越来越高。软件缺陷出现的概率以及定位这些缺陷的难度也在不断增加。软件缺陷不仅会影响系统的稳定性和可靠性,还会大幅增加软件维护和测试的成本。因此,在早期精准识别可能存在缺陷的模块,已成为提升软件质量、降低维护成本的重要课题。于是,软件缺陷预测技术[1]、[2]、[3]、[4]便成为了软件工程领域重要的研究方向。通过利用软件历史数据构建预测模型,软件缺陷预测能够帮助开发人员和测试人员尽早发现潜在缺陷,这不仅有助于提升软件质量和开发效率,还能有效降低测试和维护成本,从而保障软件系统的稳定与可靠。
软件缺陷预测主要分为两类[5]、[6]、[7]、[8]:项目内部缺陷预测和跨项目缺陷预测。项目内部缺陷预测依赖于同一软件项目的历史版本数据,这类数据能更好地反映该项目的演化规律,但难以应用于新项目或那些缺乏足够历史数据的项目。而跨项目缺陷预测则试图利用现有项目的数据进行跨项目学习,以此预测目标项目中的缺陷,这在实际工程中尤为重要。不过由于不同项目的编码风格、规模和领域存在差异,跨项目缺陷预测常常面临数据分布不均的问题,如何构建高效且可迁移的缺陷预测模型也就成了研究热点。
早期的软件缺陷预测研究主要依赖传统的软件度量指标[13]、[14]、[15]、[16],这类指标通常通过代码大小、复杂度、耦合度等静态特征来构建预测模型。虽然这些度量指标能在一定程度上反映代码质量,但往往无法捕捉源代码中更深层次的结构性和语义信息[17]。近年来,深度学习和图神经网络在处理图结构数据方面展现出强大的能力[18]、[19],这促使研究人员将软件系统表示为各种形式的程序图,如抽象语法树、控制流图、控制依赖图、数据依赖图、程序依赖图以及代码属性图,同时运用图卷积网络、图注意力网络、图同构网络以及图采样聚合网络等GNN模型。这些方法旨在直接从图结构中学习更深层次的语义和依赖关系,从而识别潜在的软件缺陷[20]、[21]、[22]、[23]、[24]、[25]。与传统专家度量指标相比,这类深度图表示方法能够更全面地刻画代码的语义和结构特征,进而提升缺陷预测的准确性。
因此,为不同的应用场景选择合适的特征表示方法和建模技术,就成了软件缺陷预测研究中的关键问题。尽管之前的缺陷预测研究已经探讨了多种图结构和GNN模型,但目前仍缺乏对不同程序图与多种GNN架构组合的系统性比较。为填补这一空白,本研究对多种程序图与多种GNN模型在项目内部缺陷预测和跨项目缺陷预测场景下的性能进行了全面的实证研究。具体而言,我们从常用的开源Java项目中提取了6种类型的程序图,并用传统软件度量指标丰富节点特征,随后用4种具有代表性的GNN模型对这些图进行训练和评估。通过系统的实验和严谨的统计分析,我们比较了24种不同图-GNN组合的缺陷预测性能,分析了它们的优缺点,为实际软件缺陷预测应用找到了最优配置方案。
本研究的结果旨在为研究人员和实践者提供可行的建议,帮助他们构建更准确、更稳健的缺陷预测模型。为此,我们提出了以下研究问题:
RQ1:不同的图-GNN组合在项目内部缺陷预测中的表现如何?
我们在7个开源Java项目的15个版本上,系统地比较了由6种程序图和4种GNN模型构成的24种图-GNN组合的预测性能。结果显示,不同组合之间的预测性能存在明显差异,其中控制流图与图卷积网络的组合在项目内部缺陷预测中表现最佳,具备较高的准确率和稳定性。
RQ2:不同的图-GNN组合在跨项目缺陷预测中的表现如何?
为评估模型的泛化能力,我们在跨项目缺陷预测场景中也使用了同样的24种图-GNN组合。测试结果表明,不同组合的性能差异较大,其中代码属性图与图注意力网络的组合表现最为出色,它始终能取得最高的预测得分,显示出很强的鲁棒性和跨项目泛化能力。
本文的主要贡献如下:
- (1)
实证框架与方法:我们对6种程序图与4种图神经网络架构在缺陷预测中的综合效果进行了实证研究,由此得到了24种不同的图-GNN组合,便于我们分析代码结构建模与神经网络学习之间的协同效应。
- (2)
图提取与数据集构建:我们直接从源代码中提取多种类型的程序图,构建基于图的软件数据集,涵盖了句法结构、控制流和数据依赖等多方面的信息。此外,我们还把传统软件度量指标作为节点特征,让模型能够同时利用结构信息和语义信息。
- (3)
实验设计与评估:我们在7个开源Java项目的15个版本上开展了大量实验,评估涵盖了项目内部缺陷预测和跨项目缺陷预测两种场景,采用了多种性能指标进行综合评价。通过非参数SKESD检验对结果进行了对比分析,发现不同图-GNN组合在各类预测任务中的性能差异显著。
- (4)
透明度与可复现性:包含构建的数据集和实验脚本的复现包已公开发布在GitHub上。2
本文的其余结构如下:第2节介绍研究背景和相关工作,第3节阐述数据集的构建过程,第4节介绍实验设计,第5节呈现实验结果,第6节总结实证发现并分析有效性可能存在的问题,最后第7节对全文进行总结。
章节要点
背景与相关研究
本节简要介绍了缺陷预测的基本流程,重点阐述了基于图结构的代码表示方法在相关研究中的应用,以及图学习领域的相关实证研究。
数据集构建
本节主要介绍本研究使用的数据来源以及数据集的构建过程。
实验设置
为研究不同代码图与图神经网络模型组合对软件缺陷预测的影响,本节详细说明了实验设置。图1展示了整个实验流程的概览,该流程共包含8个主要步骤,具体实验步骤如下:
- (1)
收集并下载7个Java项目的15个版本的源代码和JAR文件,同时从这些文件中提取专业设计的软件度量指标
RQ1的实验结果
RQ1:不同的图-GNN组合在项目内部缺陷预测中的表现如何?
研究方法:为评估不同程序图与图神经网络模型组合在项目内部缺陷预测中的性能,我们选择了7个Apache项目的15个版本,每个项目选取两个连续版本分别作为训练集和测试集,这样就得到了8组项目内部预测组合(例如activemq-5.1.0 → activemq-5.2.0)。在每组组合中,较早的版本被用作训练集
计算效率
为进一步分析不同程序图表示方法在实际应用中的计算效率,我们记录了它们的训练时间和推理时间。本研究考虑了6种类型的程序图,包括抽象语法树、控制流图、控制依赖图、数据依赖图、程序依赖图以及代码属性图。鉴于项目组合和GNN模型存在大量可能的组合,我们仅选取了一个具有代表性的案例进行对比。以项目组合“jruby-1.4.0 → jruby-1.5.0”在项目内部缺陷预测场景为例,我们采用了统一的图神经网络模型进行测试
结论
本研究对多种程序图与不同图神经网络模型结合在软件缺陷预测中的协同作用进行了系统的实证研究。我们将6种程序图与4种GNN架构进行组合,得到了24种不同的图-GNN组合,通过这种设计旨在探究图结构表示与GNN学习能力之间的相互作用。
CRediT作者贡献说明
李志强:撰写——审阅与编辑、研究指导、项目管理、方法设计、资金获取、概念构思。向彦伟:撰写——初稿撰写、结果可视化、验证工作、软件工具使用、形式化分析、数据整理。任杰:验证工作、资金获取。张鸿宇:撰写——审阅与编辑、资源协调。齐福民:资源协调。荆小远:撰写——审阅与编辑、资金获取。
Zhiqiang Li|Yanwei Xiang|Jie Ren|Hongyu Zhang|Fumin Qi|Xiao-Yuan Jing