基于常微分方程图神经网络的语句级软件缺陷预测系统转让专利

申请号 : CN202310610639.0

文献号 : CN116383089B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 尹国强王炜范启强郭元萍赵腾潘佳艺蒋晓雨刘成

申请人 : 云南大学

摘要 :

本发明公开了一种基于常微分方程图神经网络的语句级软件缺陷预测系统,所述系统具有:输入模块;语义特征表示模块;结构特征表示模块;缺陷分类模块;其中,输入模块对源代码进行语句解析,根据解析后的语句建立语句依赖图;语义特征表示模块生成语句的语义表示;结构特征表示模块根据语句依赖图和语句的语义表示,生成语句的结构表示;缺陷分类模块采用多层感知器生成每个语句的分类结果。本发明提出了一种基于常微分方程图神经网络的方法提取语义信息和结构特性生成语句表示并捕获语句中的长程依赖关系,使预测结果有更高的准确性、稳定性,解决以往缺陷预测只能在粗粒度级别实现的问题,直接在语句级别实现细粒度的缺陷预测。

权利要求 :

1.基于常微分方程图神经网络的语句级软件缺陷预测系统,其特征在于,所述系统,具有:输入模块,用于对源代码进行语句解析,根据解析后的语句建立语句依赖图;

语义特征表示模块,用于生成语句的语义表示;

结构特征表示模块,用于根据语句依赖图和语句的语义表示,利用常微分方程图神经网络捕获长程数据依赖关系,并控制语句之间的依赖关系,以生成语句的结构表示;

缺陷分类模块,用于采用多层感知器生成每个语句的分类结果;

所述输入模块,还用于分析语句间的控制依赖和数据依赖,构建语句依赖图;其中:每个节点 代表源代码中的一条语句;边集 表示语句之间的数据依赖或控制依赖,语句依赖图的邻接矩阵 描述了语句空间的拓扑结构; 表示节点i和节点j之间没有边,否则表示节点i和节点j之间有边;

所述控制依赖和所述数据依赖,具体为:

当且仅当满足以下条件时,节点 和 之间存在数据依赖关系:(1)变量 包含在语句 中;

(2)语句 使用变量 ;

(3) 和 之间有一条路径;

当且仅当满足以下条件时,语句 和 之间存在控制依赖关系:(1)语句 和 之间存在路径;

(2)语句 和 之间没有数据依赖;

所述语义特征表示模块用于在接收到语句序列输入时,将每条语句转换为矩阵,利用双向GRU捕获关键词的依赖关系,获得语义依赖项,并对每条语句进行语义依赖编码,再对语义依赖编码进行嵌入定义,生成语句的语义表示;

所述结构特征表示模块,具有:

邻居节点采样单元;

常微分方程图神经网络单元;

所述邻居节点采样单元通过选择语句依赖图中与目标节点相关性最大的n个节点生成目标节点的表示;

所述常微分方程图神经网络单元捕获语句的语义表示中长程数据依赖关系并控制语句之间的依赖关系,以生成每条语句的结构表示。

2.如权利要求1所述的基于常微分方程图神经网络的语句级软件缺陷预测系统,其特征在于,所述输入模块,还用于对解析后的语句进行关键词拆分处理。

3.如权利要求2所述的基于常微分方程图神经网络的语句级软件缺陷预测系统,其特征在于,所述关键词拆分处理包括停用词删除处理、分段处理和词干提取处理。

4.如权利要求1所述的基于常微分方程图神经网络的语句级软件缺陷预测系统,其特征在于,对语义依赖编码进行嵌入定义,生成语句的语义表示,具体采用自注意力机制动态地为每条语句分配权重,以生成语句的语义表示。

5.如权利要求1所述的基于常微分方程图神经网络的语句级软件缺陷预测系统,其特征在于,所述结构特征表示模块利用空间图神经网络,对给定的语句依赖图和语句的语义表示,生成语句的结构表示。

说明书 :

基于常微分方程图神经网络的语句级软件缺陷预测系统

技术领域

[0001] 本发明涉及软件缺陷预测技术领域,尤其涉及到一种基于常微分方程图神经网络的语句级软件缺陷预测系统及方法。

背景技术

[0002] 代码表示方法和缺陷预测模型是影响语句级软件缺陷预测模型的两个要素,本节介绍了以上两要素的研究进展。
[0003] 代码表示方法:
[0004] 源代码表示的目标是将源代码转换为相应的数值形式,可以用作缺陷预测模型的输入。由于其与缺陷预测模型的性能密切相关,该任务近年来受到了广泛关注。
[0005] 缺陷预测中最常用的表示技术是度量元,它是评估源代码质量属性的指标。由于抽象程度高,它只能表示代码的全局统计特性,如语句数量、复杂度、软件开发过程等。导致区分缺陷语句与非缺陷语句之间细小的局部差异的能力不足。另外,我们希望选择的度量元集合具有正交性,即每个度量元能独立刻画代码的某一质量属性。当前常用的度量元集合有CK、MOOD等,这些度量元之间通常存在较强的相关性。如何从这些集合中挑选出适应于代码特点的度量元是当前研究的一个难点。针对该问题研究人员提出了filter‑based,wrapper‑based和embedded‑based的度量元选择方法。然而实验结果发现这些技术对提高度量元之间的正交性贡献并不大。在极端的情况下经过特征选择的度量元集合共线性高达100%。
[0006] 近年来,研究人员从代码的语义和结构两方面提出了新的表示方法。代码是编程语言书写的文本的集合,如同自然语言一样代码具有完备的语法规则,同时变量、关键词等代码实体包含着丰富的功能语义。因此自然语言处理中许多成熟的技术可应用于代码表示。Bag‑of‑Words是缺陷预测领域常用的一种代码表示方法,该方法通过统计关键词的词频将代码转化为对应的向量表达。然而Bag‑of‑Words 技术假设关键词之间具有独立同分布假设,即假设代码关键词没有上下文信息。代码和自然语言一样拥有完备的语法规则,并且基于此定义代码语句的生成规则,保证语义的正确性。语法规则的存在导致关键词之间不可能服从独立同分布假设。另外相较于自然语言,代码的字符集较自然语言要大很多,因此使用Bag‑of‑Words技术生成代码向量通常具有高维稀疏特性,导致预测模型预测性能下降明显。神经语言模型打破了关键词之间的独立同分布假设,认为代码关键词之间具有上下文。同时神经语言模型可将代码映射成为实值短向量,有效解决了针对词袋模型生成代码向量的高维稀疏问题。Code2Vec将代码分解为路径集合和实体集合,通过路径注意力机制实现代码的分布式表示。实验结果显示该方法能有效捕获代码携带的语义信息,对提升下游应用(变量名预测)有显著作用。DeepJIT将提交报告和源代码作为两个独立卷积神经网络的输入,将其携带的语义信息抽象为特征向量。对上述两向量进行拼接作为缺陷预测网络的输入。CC2Vec通过构造层次化注意力网络生成变更对应的向量表示,并将其与 DeepJIT 生成的特征向量相拼接作为预测网络的输入。
[0007] 软件缺陷通常是由无数个不连续的语句相互作用产生的,因此语句之间的结构依赖关系与软件缺陷密切相关。构建结构依赖性的强大表示对于提高缺陷预测模型的功效至关重要。现有模型主要遵循深度学习模型+抽象语法树(AST)范式来捕捉结构依赖。具体来说,代码结构可以表示为从 AST遍历的token序列。 然后将此类序列输入到基于递归神经网络(RNN)的网络中以生成结构嵌入。但是,由于AST使用token作为节点,节点数量庞大,输入序列的长度变得非常大。基于RNN的模型可能无法捕获令牌之间的长期依赖关系。
[0008] 为了解决这些问题,研究人员利用图神经网络(GNN)来捕获源代码中的结构依赖性。为了捕获长期依赖,基于GNN的方法必须堆叠多个GNN层以扩大感受野,这通常会导致过度平滑,并且GNN的表达能力会降低。在实际应用中,堆叠GNN层的数量不应超过两个,这意味着基于GNN的方法只能捕获二阶邻域内的结构依赖性。
[0009] 缺陷预测模型:
[0010] 按照预测结果的粒度,缺陷预测模型大致可以分为粗粒度缺陷预测模型和细粒度缺陷预测模型。传统缺陷预测技术主要针对粗粒度软件实体,例如文件、类、包的预测,产生了大量的研究成果。然而这些针对粗粒度软件实体的预测模型在实际应用中遇到了挑战。首先,由于粒度较大,导致开发者需要对预测结果进行测试以及复审来定位产生缺陷的具体位置,后续开销大。另外,一个大粒度的软件实体可能被很多开发人员修改过,难以找到一个合适的开发者对存在的缺陷进行修复。
[0011] 随着研究的深入,面向语句级别的缺陷预测模型逐渐成为研究的热点。由于预测粒度小,不仅开发者可以花费更少的时间和精力去审查被预测为有缺陷的代码行,而且项目管理人员可以更准确地找到引入缺陷的开发者,有助于有效分析缺陷引入的原因,提高工程师修复缺陷的效率。近年来面向语句级别的缺陷预测模型相继提出。
[0012] 为应对上述挑战,研究者提出了面向细粒度软件实体的缺陷预测模型。其中即时缺陷预测是在提交代码时对是否存在缺陷进行的预测。与模块、文件等粗粒度缺陷预测相比,提交仅包含有限行代码,对预测结果进行代码复审和测试的开销得到有效降低。同时,代码变更提交后立即执行缺陷预测这有利于追踪缺陷的来源以及缩短缺陷修复的时间。
[0013] JITLine基于词袋模型将代码抽象为向量。使用差分演化和 SMOTE 技术解决了代码向量的数据不平衡问题。将经过处理的代码向量作为随机森林算法的输入,构建提交级别缺陷预测模型。将提交缺陷预测结果作为输入,使用可解释学习模型LIME分析每一行代码存在缺陷的可能性。
[0014] Line‑DP使用词袋模型将代码抽象成为向量,将其作为Logistic模型的训练数据,构建文件级缺陷预测模型。将文件级缺陷预测结果作为可解释学习模型 LIME 的输入,分析每个代码行存在缺陷的概率分布。
[0015] DeepLineDP提出了一种“端到端”的缺陷预测模型。该模型使用 Word2Vec 将每个语句中的标记编码为短密集向量并利用 Bi‑GRU 和注意机制来捕获标记和语句之间的长期依赖关系,实现文件级缺陷预测,最终通过缺陷文件评估token注意力来间接获得语句级缺陷预测结果,token注意力量化了对缺陷文件预测的贡献。
[0016] 即时缺陷预测统计数据显示平均每个提交包含3.7个文件,每个文件包含73‑190 行代码。预测为缺陷的提交中仅43%的文件存在缺陷。代码复审开销依旧很大,即时缺陷预测粒度还需进一步细化。
[0017] JITLine和Line‑DP将提交级或文件级缺陷预测结果作为可解释学习模型 LIME 的输入,这些模型都采用了“分层”的结构,即首先生成提交级或文件级缺陷预测结果,再使用可解释机器学习算法对预测结果进行细化以确定存在缺陷的语句。然而以LIME为代表的可解释算法存在解释结果不稳定和解释结果受超参数影响大的问题,导致对同一个缺陷使用同一方法执行多次解释,输出结果不一致;对同一缺陷使用不同局部解释方法,输出结果不一致的问题。
[0018] DeepLineDP严重依赖文件级缺陷预测效果,如果在无缺陷文件中有较高token注意力那么会很大程度上会影响语句级缺陷预测效果。同时该方法并没有考虑语句间结构特性,直接通过邻接语句来捕获长程依赖。

发明内容

[0019] 本发明的主要目的在于提供一种基于常微分方程图神经网络的语句级软件缺陷预测系统及方法,旨在解决以往缺陷预测只能在粗粒度级别实现的问题,通过图结构直接实现了语句级缺陷预测并具有高准确度,高稳定性等特点。
[0020] 为实现上述目的,本发明提供基于常微分方程图神经网络的语句级软件缺陷预测系统,所述系统,具有:
[0021] 输入模块;
[0022] 语义特征表示模块;
[0023] 结构特征表示模块;
[0024] 缺陷分类模块;
[0025] 其中,所述输入模块用于对源代码进行语句解析,根据解析后的语句建立语句依赖图;
[0026] 其中,所述语义特征表示模块用于生成语句的语义表示;
[0027] 其中,所述结构特征表示模块用于根据语句依赖图和语句的语义表示,利用常微分方程图神经网络捕获长程数据依赖关系,并控制语句之间的依赖关系,以生成语句的结构表示;
[0028] 其中,所述缺陷分类模块用于采用多层感知器生成每个语句的分类结果。
[0029] 可选的,所述输入模块,还用于对解析后的语句进行关键词拆分处理。
[0030] 可选的,所述关键词拆分处理包括停用词删除处理、分段处理和词干提取处理。
[0031] 可选的,所述输入模块,还用于分析语句间的控制依赖和数据依赖,构建语句依赖图 ;其中:每个节点 代表源代码中的一条语句;边集表示语句之间的数据依赖或控制依赖,语句依赖图的邻接矩阵 描述了语句空间的拓扑结构; 表示节点i和节点j之间没有边,否则表示节点i和节点j之间有边。
[0032] 可选的,所述控制依赖和所述数据依赖,具体为:
[0033] 当且仅当满足以下条件时,节点 和 之间存在数据依赖关系:
[0034] (1)变量 包含在语句 中;
[0035] (2)语句 使用变量 ;
[0036] (3) 和 之间有一条路径;
[0037] 当且仅当满足以下条件时,语句 和 之间存在控制依赖关系:
[0038] (1)语句 和 之间存在路径;
[0039] (2)语句 和 之间没有数据依赖。
[0040] 可选的,所述语义特征表示模块用于在接收到语句序列输入时,将每条语句转换为矩阵,利用双向GRU捕获关键词的依赖关系,获得语义依赖项,并对每条语句进行语义依赖编码,再对语义依赖编码进行嵌入定义,生成语句的语义表示。
[0041] 可选的,对语义依赖编码进行嵌入定义,生成语句的语义表示,具体采用自注意力机制动态地为每条语句分配合适的权重,以生成语句的语义表示。
[0042] 可选的,所述结构特征表示模块利用空间图神经网络,对给定的语句依赖图和语句的语义表示,生成语句的结构表示。
[0043] 可选的,所述结构特征表示模块,具有:
[0044] 邻居节点采样单元;
[0045] 常微分方程图神经网络单元;
[0046] 所述邻居节点采样单元通过选择语句依赖图中与目标节点相关性最大的n个节点生成目标节点的表示;
[0047] 所述常微分方程图神经网络单元捕获语句的语义表示中长程数据依赖关系并控制语句之间的依赖关系,以生成每条语句的结构表示。
[0048] 此外,为了实现上述目的,本发明还提供了一种基于常微分方程图神经网络的语句级软件缺陷预测方法,所述方法包括:
[0049] S1:对源代码进行语句解析,根据解析后的语句建立语句依赖图;
[0050] S2:生成语句的语义表示;
[0051] S3:根据语句依赖图和语句的语义表示,利用常微分方程图神经网络捕获长程数据依赖关系,并控制语句之间的依赖关系,以生成语句的结构表示;
[0052] S4:采用多层感知器生成每个语句的分类结果。
[0053] 本发明的有益技术效果在于:提出的一种基于常微分方程图神经网络的语句级软件缺陷预测系统及方法,所述系统具有:输入模块;语义特征表示模块;结构特征表示模块;缺陷分类模块;其中,所述输入模块用于对源代码进行语句解析,根据解析后的语句建立语句依赖图;所述语义特征表示模块用于生成语句的语义表示;所述结构特征表示模块用于根据语句依赖图和语句的语义表示,生成语句的结构表示;所述缺陷分类模块用于采用多层感知器生成每个语句的分类结果。本发明提出了一种基于常微分方程图神经网络的方法来捕获语句中的长程依赖关系,使预测结果有更高的准确性、稳定性,解决以往缺陷预测只能在粗粒度级别实现的问题,直接在语句级别实现细粒度的缺陷预测。

附图说明

[0054] 图1为本发明基于常微分方程图神经网络的语句级软件缺陷预测系统的结构示意图;
[0055] 图2为本发明实施例中提及的源代码;
[0056] 图3为本发明基于常微分方程图神经网络的语句级软件缺陷预测方法的流程示意图。
[0057] 本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
[0058] 附图标记说明:
[0059] 10‑输入模块;20‑语义特征表示模块;30‑结构特征表示模块;40‑缺陷分类模块。

具体实施方式

[0060] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0061] 本发明实施例提供了一种基于常微分方程图神经网络的语句级软件缺陷预测系统,参照图1,图1为本发明基于常微分方程图神经网络的语句级软件缺陷预测系统的结构示意图。
[0062] 具体而言,基于常微分方程图神经网络的语句级软件缺陷预测系统,具有:输入模块10;语义特征表示模块20;结构特征表示模块30;缺陷分类模块40。
[0063] 其中,所述输入模块用于对源代码进行语句解析,根据解析后的语句建立语句依赖图;所述语义特征表示模块用于生成语句的语义表示;所述结构特征表示模块用于根据语句依赖图和语句的语义表示,生成语句的结构表示;所述缺陷分类模块用于采用多层感知器生成每个语句的分类结果。
[0064] 本实施例中,将语句级软件缺陷预测定义为一个二分类问题。即给定语句集合,N为语句的个数,构建分类模型 ,其中 表示深度学习模型, 表示参数向量。如果 输出结果为1表示当前语句 存在缺陷,相反0表示没有缺陷。本实施例模型具体包含输入、结构特征表示、语义特征表示、缺陷分类四个模块。
[0065] 1.输入模块
[0066] 输入模块旨在为后续模块生成输入数据。首先,具体来说源代码被解析是将软件项目的源代码以行为单位进行分割,并使用抽象语法树解析器语法信息。经过解析后的源代码由一系列语句组成 ,每一条语句由一组关键词组成。
[0067] 自然语言相比源代码拥有更多无用的token,对其尽心计算的时间和内存开销均很大。为了缓解该问题,采用神经语言处理技术,例如停用词删除、分段和词干提取来减少此类token。停用词通常是运算符、编程语言关键词和常量。用 代替整数、实数、指数,去掉:{,(,)等符号。分段将复合标识符分成几个词,例如timerForAutomaticSaving可以拆分为四个词:timer、for、automatic和saving。词干提取可以将token转换为其词干,例如把关键词saving转换为save。
[0068] 其次,输入模块通过分析语句间的控制依赖和数据依赖,构建语句依赖图。如图2所示,为本实施例的源代码。每个节点 代表源代码中的一条语句。边集 表示语句之间的数据依赖或控制依赖。当且仅当满足以下条件时,节点 和 之间存在数据依赖关系:
[0069] 1.变量 包含在语句 中;
[0070] 2.语句 使用变量 ;
[0071] 3. 和 之间有一条路径。
[0072] 当且仅当满足以下条件时,语句 和 之间存在控制依赖关系满足条件:
[0073] 1.语句 和 之间存在路径;
[0074] 2.语句 和 之间没有数据依赖。
[0075] 语句依赖图的邻接矩阵 ,N为语句的个数,描述了语句空间的拓扑结构。 表示节点i和节点j之间没有边,否则表示节点i和节点j之间有边。
[0076] 2.语义特征表示模块
[0077] 变量名、类名等反映了语句的功能属性,这对于从非缺陷语句中识别缺陷语句很重要。本实施例中,展开语义特征表示模块的细节,它以语句序列 作为输入,从上下文的角度将语句转换为相应的实值稠密向量。语义特征表示模块由以下三个子块组成。
[0078] 首先,将语句 转换为矩阵。给定语句 ,相应的矩阵如下所示:
[0079] ,
[0080] 是由Word2Vec模型生成的 的d维嵌入,其中,j∈{1,2,…,m}。因此 是一个m×d维的矩阵。
[0081] 其次,利用双向GRU来捕获token的依赖关系。这里采用双向GRU的原因如下:1.双向GRU可以从左到右和从右到左的顺序读取token embeddings,适合捕获语句相邻节点之间的语义依赖关系。2.GRU的更新门和重置门有助于决定哪些令牌应该被记住或忘记。3.GRU在捕获token序列中的长期依赖性方面与LSTM表现相似,但参数更少。语义依赖性可以建模如下所示:
[0082] ;
[0083] ;
[0084] 将 与 连接起来以获得语义依赖项 。那么语句 语义依赖可以被编码为,其中u是单向GRU中隐藏单元的数量。因此 的维度是m×2u。
[0085] 由于每个语句有不同数量的token,所以不同语句S的维度是不同的。因此,需要将不同维度的S转换为固定的形式,根据以下等式:
[0086] ,
[0087] 为 的转置,为经过GRU学习后的语义特征表示, 是维度为k×2u的可学习权重矩阵, 是大小为m的可学习向量。调整大小后, 是k维向量。
[0088] 最后,由于语句中的token对其语义的贡献不同,因此采用自注意力机制动态地为分配合适的权重。具体来说,给定 ,语句 的嵌入定义如下:
[0089] , 为经自注意力机制学习过的语义特征表示;
[0090] 根据自注意力机制, 的定义如下:
[0091] ,
[0092] ,
[0093] ,
[0094] k∈{1,2,…,m}。
[0095] 为多层感知器的参数, 为指数函数,tanh(·)为双曲正切函数。
[0096] 3.结构特征表示模块
[0097] 在本实施例中,利用图神经网络(GNN)生成结构表示。具体来说,给定语句依赖图和所有语句的语义表示 ,结构表示可以定义为:
[0098] ,
[0099] 其中H(l+1)为:语句在第l+1层的结构表示;H(l)为:语句在第l层的结构表示;W是图神经网络的一个可学习参数; 表示图卷积神经网络,A表示邻接矩阵, 是激活函数。
[0100] 由于语句间存在长程依赖,基于神经网络的缺陷预测方法通过扩大图卷积层的堆叠数量实现扩大感受野,继而实现对长程依赖的捕获。然而卷积层的堆叠会导致现有图神经网络出现过拟合,导致模型性能急速下降。另外,一个软件系统通常包含数以万计的代码行,对应的邻接矩阵不仅规模庞大,而且具有较高的稀疏特性。谱图卷积神经网络需要对邻接矩阵进行归一化操作 ,其中D是邻接矩阵A的度矩阵,以及矩阵分解操作。以上两个操作均涉及复杂的计算过程和大量的存储开销。
[0101] 针对语句依赖图的大尺度稀疏化特点,本实施例提出了一种空间图神经网络。该网络由采样和偏微分图神经网络两部分组成。
[0102] 3.1邻居节点采样
[0103] 本实施例基于随机游走技术建立邻居节点采样方法,选择与目标节点相关性最大的 个节点用于生成目标节点的表示,而不再是对全图节点进行计算,大大降低了计算复杂程度和存储开销。
[0104] 具体来说 层网络中节点 的表示可定义为
[0105] ,
[0106] 上述公式可以重写为对应的数据期望形式:
[0107] 、
[0108] 表示节点 相邻节点的个数。表示节点 , 之间存在依赖关系的概率。 是一个可学习参
数。在本实施例中,利用蒙特卡洛采样来近似处理, 估计为:
[0109] ,
[0110] 通过设置 ,蒙特卡洛估计可以将复杂度从 降低到,其中 表示边数, 表示节点特征在层 。
[0111] 然而,假设每个节点的重要性与其邻居节点相关, 。这种假设是不合理的,因为语句依赖图中的每个节点都具有不同的功能并且对整个软件系统具有不同的重要性。此外,目标节点与其邻居节点之间的距离反映了邻居节点与目标节点之间的数据依赖或控制依赖的强弱。所以我们这里采用重要性采样技术将其变换为如下形式:
[0112] ,
[0113] 其中 定义为给定节点集 采样的概率。根据上述公式及蒙特卡洛采样转化公式为:
[0114] ,
[0115] 可以通过在层归一化传输矩阵 得到, 定义为:
[0116] ,
[0117] 矩阵 定义为 ,其中度矩阵 。
[0118] 3.2 常微分方程图神经网络
[0119] 为了解决基于GNN的模型的长程依赖关系捕获问题,本实施例利用常微分方程(ODE)图神经网络来捕获长程数据依赖关系并控制语句之间的依赖关系。节点间的信息传播过程可以定义为:
[0120] ,
[0121] 其中 是第n层图神经网络的节点的表示,节点的初始特征由语义特征模块生成语义特征向量定义。可学习参数 刻画了邻接节点的重
要程度。可以看出,第n层图神经网络的节点表示不仅受邻居节点表示的影响还受初始节点特征的影响。上述公式可以进一步演化为:
[0122] ,
[0123] 由此可知,当n趋近于一个较大的自然数时,语句之间的长程依赖可以表达为等比数列求和形式。
[0124] 接下来通过将n替换为连续变量 实现将节点特征的扩散过程扩展到连续情况,并进一步使用ODE来表征这种连续传播过程。显然上述公式可看做时间从t=0到t=n积分的黎曼和,能够自然地从离散传播过程转移到连续情况。因此可看做以下常微分方程的离散化形式:
[0125] ,
[0126] 通过对上述公式进行一阶泰勒展开得到:
[0127] ,
[0128] 其中 是图神经网络的输入数据,矩阵 描述了邻居节点影响目标节点表示的机制。
[0129] 因此对应的解析解为
[0130] ,
[0131] 函数 定义为:
[0132] ,
[0133] 其中 。
[0134] 由于邻接矩阵A的值域是 ,因此A‑1,W‑1的特征值均属于区间(‑1,0),对于任意i有 。因此当t趋近于无穷的时候, 和 都趋近于0,公式可分别简化为:
[0135] ,
[0136] ,
[0137] 给定邻接矩阵A根据上述公式可为每条语句生成对应的依赖特征H(t)。由于上述公式的计算量仅依赖于矩阵 和 的矩阵分解,不会随着t的增大而增大。因此尽管语句依赖图规模很大,但生成节点表示的计算量几乎是一个常数。
[0138] 4.缺陷分类模块
[0139] 本实施例中,采用多层感知器(MLP)来生成每个语句的分类结果。相应的损失函数定义为二元交叉熵:
[0140] ,
[0141] 其中 和 表示预测结果和真实结果,W是为解决不平衡问题而赋予每个批次元素损失的手动重新缩放权重。
[0142] 本实施例解决以往软件缺陷预测只能在粗粒度级别(文件、函数、类、包等)实现的问题,在语句级别实现细粒度(语句级)的缺陷预测。对于语句表示,提出了一种判别式特征提取方法。该方法不再将度量元作为输入,而是通过将深度学习和图神经网络模型结合在一起来同时捕获语句之间的语义和结构依赖性为每个语句生成表示。它缓解了现有代码表示方法无法区分缺陷语句和非缺陷语句之间差异的局限性,有助于提高缺陷预测模型的性能。提出了一种基于常微分方程图神经网络的方法来捕获语句中的长程依赖关系。节点之间的长程依赖关系被抽象为图节点表示的偏微分方程,以堆叠层数表示。这有效地解决了增加堆叠层数导致的过度平滑问题,同时也降低了计算复杂度。
[0143] 在实际应用中,解决以往缺陷预测只能在粗粒度级别实现的问题,在语句级别实现细粒度的缺陷预测,降低了开发人员的审查开销和精力。在软件工程项目中,不同代码行之间的依赖关系很复杂。虽然传统 GNN 的性能会因多层堆叠后的过度拟合而下降,但常微分方程图神经网络可以更好地捕获基于图结构特征的长程依赖关系,使预测结果有更高的准确性,稳定性。
[0144] 参照图3,图3为本发明基于常微分方程图神经网络的语句级软件缺陷预测方法实施例的流程示意图。
[0145] 如图3所示,本发明实施例提出的基于常微分方程图神经网络的语句级软件缺陷预测方法,用于前述实施例记载的基于常微分方程图神经网络的语句级软件缺陷预测系统,该方法包括:
[0146] S1:对源代码进行语句解析,根据解析后的语句建立语句依赖图;
[0147] S2:生成语句的语义表示;
[0148] S3:根据语句依赖图和语句的语义表示,利用常微分方程图神经网络捕获长程数据依赖关系,并控制语句之间的依赖关系,以生成语句的结构表示;
[0149] S4:采用多层感知器生成每个语句的分类结果。
[0150] 本发明基于常微分方程图神经网络的语句级软件缺陷预测方法的其他实施例或具体实现方式可参照上述各系统实施例,此处不再赘述。
[0151] 可以理解的是,在本说明书的描述中,参考术语“一实施例”、“另一实施例”、“其他实施例”、或“第一实施例~第N实施例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0152] 需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
[0153] 上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0154] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0155] 以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。