基于反例训练的图神经网络程序缺陷预测方法

文档序号:37278735发布日期:2024-03-12 21:15阅读:17来源:国知局
基于反例训练的图神经网络程序缺陷预测方法

本发明属于软件工程、程序语言和深度学习的交叉领域,涉及程序语义的学习方法和程序性质的预测方法,具体涉及一种基于反例训练的图神经网络程序缺陷预测方法。


背景技术:

1、随着计算机技术的迅速发展,软件数量在迅猛增加,开源oss被广泛利用,软件的缺陷数量和缺陷的影响也在日益增加和扩大。软件缺陷会对计算机系统的安全运行产生潜在的威胁,会给社会带来巨大的经济损失,也有可能存在严重的信息泄漏问题。因此需要进一步研究程序缺陷检测技术。

2、基于静态分析、动态测试、形式化方法的缺陷检测技术虽然经历了几十年的发展,但是依旧存在效率低、成本高的问题。已有一些工作基于机器学习技术降低缺陷检测的成本或以此预测缺陷。目前随着深度学习技术的发展,图神经网络(graph neural network,简称gnn)作为其中一类神经网络模型,被广泛应用于社交网络、推荐系统、金融风控、物理系统、分子化学、生命科学、知识图谱和交通预测等领域。同时,在针对程序缺陷检测的研究中,学者们也对图神经网络以及相关模型的表现展示了越来越多的兴趣和关注。图神经网络已在程序分析领域取得了突出的成果,如变量误用预测、函数名预测和缺陷检测与修复等工作上,图神经网络的表现优于其他基于文本或序列的方法。

3、基于深度学习技术预测程序缺陷逐渐成为学术界探索的方向。但是,现有程序代码的数据表示形式缺少程序结构信息,并且程序中大量的分支、循环、递归、函数调用等复杂程序结构增加了深度学习技术理解程序语义的难度,导致已有模型预测程序缺陷的能力不足。

4、早期的工作主要将程序源码视为文本,并通过自然语言处理技术寻找程序中浅显的、基于文本的模式。之后的方法旨在从抽象语法树(即ast)中学习具有语义信息的程序嵌入。尽管这些方法取得了进步,但由于ast能够提供的信息有限,这种基于树的模型仍仅限于学习程序的语法特征。最近,另一种称为图神经网络的模型被引入编程领域。其主要思想是不再直接从源码学习程序表示,而是将问题化简为从程序的图表示中学习。借助更高效的消息传递方法,gnn已在不同领域取得了成果,例如变量误用预测,函数名预测和错误检测与修复。尽管gnn已大大改善了先前的工作,但其精度和效率问题仍有待解决,主要存在如下挑战:

5、第一个挑战是gnn目前在程序缺陷预测领域的精度仍然不高,亟待解决。程序缺陷易对软件系统安全造成很大的潜在威胁,很有可能带来财产损失和安全隐患。因此高效、精确地预测程序缺陷对保证软件系统安全具有十分重要的意义。然而,目前的研究证明了gnn在程序缺陷预测领域运用的可行性,精确率和召回率仍不理想,存在许多程序缺陷被漏报和误报。因此提高gnn在程序缺陷预测领域的精度具有重要的意义。

6、第二个挑战是gnn在基础的训练过程中可能会遗漏掉一些程序的图表示中独特的结构特征,当某些能够表征程序缺陷的特征未被gnn学习得到时,gnn在验证集上对具有这些特征的样本的预测精度就会受到影响,因此需要去强化gnn对训练过程中遗漏掉的特征进行学习。

7、第三个挑战是由于其基本的消息传递过程的高昂成本,gnn难以从节点数目过多的图中学习。理想情况下,每个节点都应将消息直接或间接传递给图中的每个其他节点,以进行足够的信息交换。但是,这种昂贵的信息传播过程很难在不引起精度损失的情况下扩展到节点众多的图。这是由于消息传递技术虽然赋予了gnn强大的学习能力,但是阻碍了gnn学习图中相距较远的节点所蕴含信息的能力。从信息传播的角度来看,起始节点发出的消息需要经过许多中间节点才能到达终止节点。由于聚合操作,只要消息被中间节点吸收以更新其自身状态,该消息就会被稀释。在消息到达结束节点时,其精确性将严重降低。在程序语言领域,由于代码功能、逻辑的复杂性,导致长距离依赖关系非常常见。这也使得神经网络模型在程序的图表示中的学习难度更高。所以为了提高学习效果,需要能够学习该关系的特征。为了解决长距离依赖问题,已有工作在抽象语法树(ast)中设计了额外的边来连接有一定关系的节点(例如数据或控制依赖)。但是该工作仅是从理论上讨论了其方法的有效性,并未通过严格测试证明该模型的可扩展性;并且也未给出具体需要如何增加依赖边可以使得模型具有最优可扩展性。


技术实现思路

1、针对现有技术中的问题,本发明提出基于反例训练的图神经网络程序性质预测方法,使得图神经网络能够强化对训练过程中未学习得到的程序图特征的学习,从而提升在程序性质预测方面的精度和能力。

2、为解决以上问题,本发明采用以下技术方案来实现:

3、一种基于反例训练的图神经网络程序缺陷预测方法,该方法针对一个程序性质预测任务,首先收集与程序性质相关的原始数据集,将其中的程序源代码转换成图抽象表示,得到实验数据集,然后基于实验数据集训练图神经网络模型,随后基于图神经网络模型在训练数据集无法正确预测的样本,进行程序随机变异生成相似的反例样本,并加入图神经网络模型的训练集进一步训练模型,最后借助训练出来的模型进行程序性质预测。

4、上述基于反例训练的图神经网络程序缺陷预测方法,其特征在于,具体包括以下步骤:

5、步骤1)制定一个程序性质预测任务,收集与所述程序性质预测任务对应的原始数据集用于训练预测存在特定程序性质的方法;每个数据样本的内容包括了程序方法(函数)源代码和能够表征该特定程序性质的最小源代码片段;

6、步骤2)将原始数据集内的程序源代码转换为图抽象表示,得到实验数据集。通过构建控制流图和对应语句的抽象语法树将程序源代码转化为具有控制流边和抽象语法边的图表示,得到实验数据集;

7、步骤3)将得到的实验数据集划分为训练集和验证集,并将训练集作为输入训练图神经网络模型,利用验证集评估模型的效果;模型的输出为某特定样本是否具有特定程序性质;

8、步骤4)借助训练出的图神经网络模型对训练集样本的预测结果,选取预测错误的样本数据生成反例样本;通过对预测错误的样本对应的源代码进行随机变异生成相似的数据样本,给予其真实的程序性质标签,再进行静态分析确认,将确认无误的样本加入模型的训练集,进行下一轮的图神经网络模型训练,重复多次反馈训练过程以提高模型的泛化能力和预测效果;

9、步骤5)借助训练出的模型预测实际程序中的程序性质;先计算出每个节点的状态向量,然后通过汇总所有所述节点的状态计算整个图的最终表示;最后训练前馈神经网络和整个图的表示预测方法是否有特定性质。

10、上述基于反例的图神经网络程序缺陷预测方法,其进一步特征在于,所述步骤2)具体包括以下步骤:

11、步骤21)构建控制流图;给定一个函数,通过分析程序源码得到特定程序特征性质所涉及函数的控制流图,然后将每个基本块拆分为多个节点,每个节点都是基本块内的一条语句,通过这种方式能够分析具体的语句;在分析一个函数时,将所述函数所有调用函数和被调用函数拼接到所述函数的图中,形成完整的函数调用链,用来描述所述函数的上下文关系。

12、步骤22)构建抽象语法树。本方法实施例先获取所述节点对应的语句,再构建对应语句的抽象语法树,通过预定义的字典将所述抽象语法树中每一个节点转换成字典中的索引(用正整数表示),针对每一个节点vi,所述节点vi表示为(t1,t2,...,tj),其中j是节点的数目,tm,m∈{1,...,j}即是所述节点在字典中的索引;最后通过一个哈希函数确定所述节点的特征值。

13、步骤23)形成源代码的图抽象表示。节点之间的边有两种类型,在分析得到所涉及函数的控制流图时,得到了节点之间的控制流边;在构建所述节点对应语句的抽象语法树时,得到了节点之间的抽象语法边,这两种边构成了程序图抽象表示中节点之间的边。

14、所述步骤4)具体包括以下步骤:

15、步骤41)根据ggnn模型初始训练结果,选取训练后模型无法正确预测程序性质的训练集样本进行反例生成;

16、步骤42)基于步骤41)中选取的样本,通过其对应的步骤1)中的最小源代码片段确定关键性语句,程序源代码片段之外的所有程序语句作为不相关语句;关键性语句的定义为:该样本程序中能够表征特定程序性质的最小程序语句集合,即为步骤1)原始数据集中每一个样本能够表征特定程序性质的最小源代码片段;不相关语句的定义为:该样本程序中不会对特定程序性质造成影响的程序语句集合,即为步骤1)原始数据集中每一个样本源代码去除所有关键性语句的语句集合;

17、步骤43)选取步骤41)的一个样本,将该样本的关键性语句集合作为初始化反例样本,定义初始化反例样本为第0轮反例样本;获取该样本不相关语句的数量为n;将不相关语句进行编号,分别为不相关语句1、不相关语句2……不相关语句n;

18、步骤44)在第m轮训练中选取不相关语句m,对该语句进行随机变异。其中,m初始化为1,随后递增至n。变异的方式包括在此语句前后添加其他语句、对语句中变量名或变量类型或变量值进行修改、对判断条件进行修改等。将变异得到的语句集合添加至第m-1轮的样本中组合生成第m轮的反例样本;

19、步骤45)对步骤44)得到的反例样本进行静态分析确认;确认生成的反例样本具有所指定的特定程序性质。若生成的反例样本不具有特定程序性质,则返回步骤44)中重新依据不相关语句m生成反例样本;若生成的反例样本具有特定程序性质,则进入下一步骤;

20、步骤46)将反例样本经过程序转换成图抽象表示后加入图神经网络模型的训练集进行训练,判断模型能否正确对该反例样本对应的原始样本特定程序性质进行预测,若图神经网络模型已经能够对原始样本正确预测,则终止该原始样本的反例训练,否则进入步骤44)继续进行反例训练。

21、上述的基于反例的图神经网络程序缺陷预测方法,其特征在于:所述图神经网络模型采用的是门控图神经网络,即ggnn模型,它的输入是程序源代码转换后的图抽象表示,转换方式是首先构造程序的语句级控制流图,此时每个基本块就是一条语句,再将每条语句通过抽象语法树表示。

22、上述的基于反例的图神经网络程序缺陷预测方法,其特征在于:所述反例样本的定义是:基于图神经网络模型在训练数据集无法正确预测的样本,进行语句随机变异、修改而生成的新的数据样本。

23、本发明采用以上技术方案,具有以下有益效果:

24、本发明可增强图神经网络模型学习程序语义的能力以及对程序缺陷的预测能力,提高正确性、安全性等程序性质预测任务的预测效果;本发明将程序源代码转化为图抽象表示的方式能够强化图神经网络对程序语义的学习,从而提成图神经网络对程序语义的学习能力;本发明通过反例对图神经网络进一步训练,使得图神经网络能够强化对训练过程中未学习得到的程序图特征的学习,从而提升在程序性质预测方面的精度和能力。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1