一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于图区间神经网络的程序语义表示学习和预测方法

2023-02-10 19:59:01 来源:中国专利 TAG:


1.本发明属于软件工程、程序语言和深度学习的交叉领域,涉及程序语义的学习方法和程序性质的预测方法,具体涉及一种基于图区间神经网络的程序语义表示学习和预测方法。


背景技术:

2.基于静态分析、动态测试、形式化方法的缺陷检测技术虽然经历了几十年的发展,但是依旧存在效率低、成本高的问题。已有一些工作基于机器学习技术降低缺陷检测的成本、或以此预测缺陷。目前随着深度学习技术的发展,图神经网络(graph neural network,简称gnn)作为其中一类神经网络模型,被广泛应用于社交网络、推荐系统、金融风控、物理系统、分子化学、生命科学、知识图谱和交通预测等领域。同时,在针对程序缺陷检测的研究中,学者们也对图神经网络以及相关模型的表现展示了越来越多的兴趣和关注。图神经网络已在程序分析领域取得了突出的成果,如变量误用预测、函数名预测和缺陷检测与修复等工作上,图神经网络的表现优于其他基于文本或序列的方法。
3.基于深度学习技术预测程序缺陷逐渐成为学术界探索的方向。但是,现有程序代码的数据表示形式缺少程序结构信息,并且程序中大量的分支、循环、递归、函数调用等复杂程序结构增加了深度学习技术理解程序语义的难度,导致已有模型预测程序缺陷的能力不足。
4.早期的工作主要将程序源码视为文本,并通过自然语言处理技术寻找程序中浅显的、基于文本的模式。之后的方法旨在从抽象语法树(即ast)中学习具有语义信息的程序嵌入。尽管这些方法取得了进步,但由于ast能够提供的信息有限,这种基于树的模型仍仅限于学习程序的语法特征。最近,另一种称为图神经网络的模型被引入编程领域。其主要思想是不再直接从源码学习程序表示,而是将问题化简为从程序的图表示中学习。借助更高效的消息传递方法,gnn已在不同领域取得了成果,例如变量误用预测,函数名预测和错误检测与修复。尽管gnn已大大改善了先前的工作,但其精度和效率问题仍有待解决,主要存在如下挑战:
5.第一个挑战是gnn对所处理的图的类型不作区分。换句话说,一旦程序被转换成图,它们将与来源于其他问题(例如社交网络,分子结构)的图以相同的方式进行处理。这导致它无法利用程序的图表示中独特的结构特征。
6.第二个挑战是由于其基本的消息传递过程的高昂成本,gnn难以从节点数目过多的图中学习。理想情况下,每个节点都应将消息直接或间接传递给图中的每个其他节点,以进行足够的信息交换。但是,这种昂贵的信息传播过程很难在不引起精度损失的情况下扩展到节点众多的图。这是由于消息传递技术虽然赋予了gnn强大的学习能力,但是阻碍了gnn学习图中相距较远的节点所蕴含信息的能力。从信息传播的角度来看,起始节点发出的消息需要经过许多中间节点才能到达终止节点。由于聚合操作,只要消息被中间节点吸收以更新其自身状态,该消息就会被稀释。在消息到达结束节点时,其精确性将严重降低。在
程序语言领域,由于代码功能、逻辑的复杂性,导致长距离依赖关系非常常见。这也使得神经网络模型在程序的图表示中的学习难度更高。所以为了提高学习效果,需要能够学习该关系的特征。为了解决长距离依赖问题,已有工作在抽象语法树(ast)中设计了额外的边来连接有一定关系的节点(例如数据或控制依赖)。但是该工作仅是从理论上讨论了其方法的有效性,并未通过严格测试证明该模型的可扩展性;并且也未给出具体需要如何增加依赖边可以使得模型具有最优可扩展性。此外,该方法不做区分地对抽象语法树上的所有节点都增加其预定义的依赖边,使得模型无法达到最优效果。


技术实现要素:

7.针对现有技术中的问题,本发明提出基于ginn的程序性质预测方法,使得图神经网络更侧重于程序本身的循环结构这一关键结构,从而提升在程序性质预测方面的能力。
8.为解决以上问题,本发明采用以下技术方案来实现:
9.一种基于图区间神经网络的程序语义表示学习和预测方法,其特征在于,该方法针对一个程序性质预测任务,首先收集对应的数据集,将其中的程序转换成图,然后基于转换后的数据集训练基于区间的图神经网络模型,最后借助训练出的模型进行程序性质的预测。
10.上述的基于图区间神经网络的程序语义表示学习和预测方法,其特征在于,具体包括以下步骤:
11.步骤1)制定一个程序性质预测任务,收集与所述程序性质预测任务对应的数据集用于训练存在特定程序性质的方法,为了收集无特定程序性质的方法,以抽象语法树之间的树编辑距离最接近的作为对象为每种有特定程序性质的方法匹配无特定程序性质的方法,通过为每个有特定程序性质的方法匹配多个无该性质的方法以进一步扩大所述数据集;
12.步骤2)将数据集内的程序转换成语句级控制流图,给定一个函数,通过分析程序得到所述函数的控制流图,然后将每个基本块拆分为多个节点,每个所述节点都是所述基本块内的一条语句,在分析函数时,将所述函数所有调用者和被调用者拼接到所述函数的图中,以此来包含函数的上下文关系,为了抽取每个节点的初始状态,先获取所述节点对应的语句,再分析出所述语句对应的ast,最后通过预定义的字典将所述ast中每一个节点转换成字典中的索引,所述索引用正整数表示,针对每一个节点vi,所述节点表示为t1,t2,...,tj,其中j是节点的数目,tm,m∈{1,...,j}是所述节点在字典中的索引,然后引入rnn模型用于学习语句中每一个节点的向量表示,最后以所述rnn模型的最终的隐藏状态作为各个节点的初始状态;
13.步骤3)在转换后的图所划分的区间内学习程序的表示,提出一种新的图模型,所述图模型为图区间神经网络,所述图模型用控制流图表示输入程序,使用分区、升阶和降阶三个基本运算符对控制流图进行抽象,每个基本运算符都对应一个额外的更新运算符,所述更新运算符用于在应用基本运算符之后计算基本运算符生成的图上每个节点的状态,分区运算符将图划分成区间,再运用更新运算符更新所述区间内的状态、升阶运算符将所述区间合并成一个节点,再运用更新运算符更新合并后的图的状态,降阶运算符在升阶到最高阶的图之后运用,将所述节点逐步恢复成上一级区间,再运用更新运算符更新恢复后的
区间的状态;
14.步骤4)借助训练出的模型预测实际程序中的程序性质,先计算出每个节点的状态向量,然后通过汇总所有节点的状态计算整个图的最终表示,最后训练前馈神经网络和整个图的表示预测方法是否有特定性质。
15.上述的基于图区间神经网络的程序语义表示学习和预测方法,其特征在于:所述图区间神经网络,它的输入是程序转换后的图表示,转换方式是首先构造程序的语句级控制流图,此时每个基本块就是一条语句,再将每条语句通过抽象语法树表示,然后依据转换后的图所划分的区间逐步学习程序的表示。
16.上述的基于图区间神经网络的程序语义表示学习和预测方法,其特征在于:首先基于控制流图表示程序,然后通过将控制流图依据区间结构划分为子图,再基于依据特定程序性质收集的数据集中的程序及对应的性质信息,训练图区间神经网络模型;最后将所述神经网络模型应用于程序性质预测。
17.上述的基于图区间神经网络的程序语义表示学习和预测方法,其特征在于,所述神经网络模型基于控制流图表示程序,强调程序结构的局部性,使用基于图区间神经网络对程序性质进行训练,学习程序语义,使用基于图区间神经网络对正确性、安全性、实时性、相似性、并发性等程序性质进行预测,报告潜在的程序缺陷、程序漏洞、性能问题、相似程序、并发关系等程序内隐藏的信息。
18.本发明通过采用以上技术方案,可以得到以下有益效果:
19.本发明的基于图区间神经网络的程序语义表示学习和预测方法主要在于提高深度学习模型学习程序语义的能力,最终提高程序性质预测的准确率。
附图说明
20.图1是本发明实施例的基于图区间神经网络的程序语义表示学习和预测方法框架图。
21.图2是本发明实施例的用于静态分析的线程标签的定义图。
22.图3是本发明实施例的用于静态分析的线程标签的转换规则图。
具体实施方式
23.为了使本领域技术人员更好地理解本发明,以下结合附图和具体实施例对本发明作进一步详细阐述。
24.本实施例提供一种基于图区间神经网络的程序语义表示学习和预测方法,具体包括以下步骤:
25.步骤1)制定一个程序性质预测任务,收集与该任务对应的数据集;除了用于训练存在特定程序性质的方法(函数)外,还必须提供无该程序性质的方法(函数);为每种有特定程序性质的方法匹配无特定程序性质的方法时,是以ast之间的树编辑距离最接近的作为对象;为了进一步扩大数据集的规模,通过为每个有特定程序性质的方法匹配多个无该性质的方法以进一步扩大该数据集。
26.步骤2)将数据集内的程序转换成语句级控制流图;给定一个函数,通过分析程序得到所述函数的控制流图,然后将每个基本块拆分为多个节点,每个所述节点都是所述基
本块内的一条语句;在分析一个函数时,还通过将所述函数的所有调用者和被调用者拼接到所述函数的图中,以此来包含所述函数的上下文关系;为了抽取每个节点的初始状态,本实施例先获取所述节点对应的语句,再分析出所述语句对应的ast,最后通过预定义的字典将所述ast中每一个节点转换成字典中的索引(用正整数表示),针对每一个节点vi,所述节点表示为(t1,t2,...,tj),其中j是节点的数目,tm,m∈{1,...,j}即是所述节点在字典中的索引;然后,引入rnn模型用于学习语句中每一个节点的向量表示;最后以所述rnn模型的最终的隐藏状态作为各个节点的初始状态;
27.步骤3)在转换后的图所划分的区间内学习程序的表示;本实施例提出一种新的图模型,称为图区间神经网络(graph interval neural network,ginn),所述图模型用控制流图(cfg)表示输入程序,并使用分区、升阶和降阶这三个基本运算符对其进行抽象;每个基本运算符都对应一个额外的运算符,称为更新运算符,所述更新运算符用于在应用基本运算符之后计算其生成的图上每个节点的状态;具体而言,分区运算符将图划分成区间,再运用所述更新运算符更新每个区间内的状态、升阶运算符将区间合并成一个节点,再运用所述更新运算符更新合并后的图的状态,降解运算符在升阶到最高阶的图之后运用,将节点恢复成区间,再运用更新运算符更新恢复后的区间的状态;
28.步骤4)借助训练出的模型预测实际程序中的程序性质;先计算出每个节点的状态向量,然后通过汇总所有所述节点的状态计算整个图的最终表示;最后训练前馈神经网络和整个图的表示预测方法是否有特定性质。
29.以下具体分析:
30.一、整体框架
31.图1展示了本发明实施例的主要框架和各个模块的概况:1)ginn模型:所述ginn模块基于依据特定程序性质收集的数据集中的程序及对应程序性质信息,训练图区间神经网络(ginn)模型;2)程序分析:所述程序分析模块对输入(即程序源码)进行分析,构造控制流图,再基于控制流图和每个语句的抽象语法树,以图的形式表示被测程序,最后把程序的图表示传递给程序性质预测模块;3)程序性质预测模块:所述程序性质预测模块将源码的程序表示传递到所述ginn模型中,用以查询模型的预测结果;最后输出预测结果。
32.以下依据所述整体框架图,分别介绍数据集收集、ginn模型、程序的表示方法和程序性质预测方法。
33.二、数据集收集
34.制定一个程序性质预测任务,收集与所述程序性质预测任务对应的数据集,除了用于训练存在特定程序性质的方法(函数)外,还必须提供无该程序性质的方法(函数),为每种有特定程序性质的方法匹配无特定程序性质的方法时,是以ast之间的树编辑距离最接近的作为对象,为了进一步扩大数据集的规模,通过为每个有特定程序性质的方法匹配多个无该性质的方法以进一步扩大该数据集,对于每个项目,正确和错误的方法之间保持大约3:1的比率。
35.三、图区间神经网络(ginn)构建
36.所述图区间神经网络构建的核心思想是,模型可以通过程序中更抽象的表示增强泛化能力;考虑到通用性和能力,本发明选择基于gnn引入ginn,此时面临的主要挑战是:如何将程序抽象为有利于gnn学习的表示形式;一个自然的想法是在源代码级别抽象程序,然
后将被抽象的程序简化成一个图,另一个更简单也更优雅的方法是直接在程序的图表示上抽象程序;基于此,本实施例提出了一种新的图模型,称为图区间神经网络(graph interval neural network,ginn),所述图区间神经网络模型用控制流图(cfg)表示输入程序,并使用三个基本运算符对其进行抽象,分别为:分区(partitioning),升阶(heightening)和降阶(lowering),每个基本运算符都对应一个额外的运算符,用于在应用基本运算符之后计算其生成的图上每个节点的状态;也就是说,该额外运算符的作用类似于gnn基于相邻节点更新当前状态,但只在运用基本运算符后所生成的图中计算节点状态;以图2所对应的控制流图(即图2(a))为示例,详细介绍ginn的方法:首先,ginn使用分区运算符将图分成一组区间,图2(b)对每个节点都标记了各自的样式,用于指示图中的四个区间,然后所述ginn使用所提到的额外运算符来计算每个节点状态,与现有gnn中标准的消息传递机制不同,所述ginn将消息传递限制在区间内,如果区间本身就是一个节点,则不会通过额外运算符更新其状态,例如,图2(b)中的节点3、4、5和6在不断计算自己的状态的同时将消息自由传递给该区间内的相邻节点,另一方面,节点1和2的区间就是自身,因此保持各自节点状态不变,区间的传播机制与现有gnn中的机制相同,本发明将分区运算符形式化如下:
37.定义1(分区)分区操作(记为ρ)是序列(ρ
abs
,ρ
com
),其中(ρ
abs
:gn→
sn一个将n阶图映射到n阶区间的集合的函数;ρ
com
:是一个在每个n阶图计算e维向量的函数,如下公式定义了ρ
com

38.基于in(h)的节点数目,如下两个情况需要考虑:
[0039][0040]
接下来,ginn应用升阶运算符将一阶图转换为二阶图(图2(c)),特别地,升阶操作用将低阶图上的每个区间(多个节点组成)替换成高阶图上的一个节点(例如,节点3、4、5和6被节点8替换),根据新创建节点的状态,ginn将它们初始化为所替换节点状态的加权和,升阶运算符定义如下:
[0041]
定义2(升阶)升阶操作(记为η)是(η
abs
,η
com
),其中η
abs
:gn→gn 1
是一个将n阶图映射成(n 1)阶图的函数;η
com
::表示在gn中节点的集合;{v
1n 1
,v
2n 1
,...v
nn 1
}表示在g
n 1
中节点的集合)是一个将gn内每个节点的e维向量映射成g
n 1
内每个节点的e维向量的函数,如下公式定义了η
com

[0042]
本发明考虑如下两个情况:
[0043][0044]
第一种情况下,(n 1)阶图的v
in 1
和n阶图的v
in
相同,并且v
hn 1
用于替代in(h)这个区间,每个状态向量的权重(即αv)基于长度定义(如下公式)计算:
[0045][0046]
然后,ginn再次使用分区运算符从二阶图生成一组区间(图2(d)),基于消息传递机制,消息仅在节点2、7和8之间传递,但是,由于可以将节点8视为节点3~6的代表,因此这种交换实质上涵盖了一阶图上除节点1之外的所有节点,换句话说,即使消息总是在一个区间内交换,升阶操作扩展了区间能够覆盖的节点,从而使原本相距较远的节点之间的通信成为可能;
[0047]
然后,ginn第二次应用升阶操作,生成三阶图(图2(e)),由于三阶图本身就是一个区间,因此所述ginn使用分区运算符以与现有gnn相同的方式计算节点1和9的状态,现在,所述ginn达到了一个重要的点,本发明称之为充分传播,也就是说,每个节点都已将消息直接或间接传递给原始控制流图中的每个其他可达节点,即不再需要升阶运算符;
[0048]
节点1和9之间的消息交换完成后,ginn应用降阶运算符将三阶图转换回二阶图,具体而言,在较高阶图上创建的用于替换较低阶图上的区间的节点将被拆分成该区间原本组成的节点(例如,节点9至节点2、7和8),这个想法是,在达到充分传播后,ginn开始恢复原始控制流图上每个节点的状态,本发明在下面定义降阶运算符:
[0049]
定义3(降阶)降阶操作(记为λ)是(λ
abs

com
),其中λ
abs
:g
n 1
→gn
是η
abs
的反函数,即将(n 1)阶图映射成n阶图,并且λ
com

v1n 1

v2n 1
,...μ
vn’n 1
∈re→
μ
v1n

v2n
,...μ
vn’n
∈re({v
1n 1
,v
2n 1
,...v
n’n 1
}表示g
n 1
中节点的集合;{v
1n
,v
2n
,...v
n’n
}
[0050]
表示gn中节点的集合)是一个将g
n 1
中每个节点的e维向量映射成gn中每个节点的e维向量的函数,如下公式定义了λ
com

[0051]
总体而言,λ
com
可以被认为是η
com
的逆操作:
[0052][0053]
类似的,n阶图的v
in
和(n 1)阶图的v
in 1
相同,并且所述v
hn 1
被分割成一系列节点,每个节点都被赋值为每个状态向量的权重(即αv),而所述|i
n 1
(h)|是为了保持各个节点向量的标准化,使得其加权和与原节点一致;
[0054]
当ginn重新分析到二阶图时,它重新应用分区运算符以生成唯一需要被处理的区间(即节点2、7和8),但是,这一次在计算节点2、7和8的状态时存在一个关键区别,即由于三阶图上节点1和9之间的交换,这三个节点之间的通信不再局限于它们自己的状态,而是包括了节点1,总体而言,这种循环传播机制通过整合整个图的信息来提高表示节点的精度;
[0055]
接下来,ginn再次应用降阶运算符以还原初始的控制流图,进行分区操作后,所述ginn为图上的每个节点计算状态向量,从而表明完成一个完整的周期,整个过程将重复固定的次数,然后本发明将最后一步的状态向量用作节点的最终表示,通过运行示例概括了ginn的抽象周期,其具体定义如下:
[0056]
定义4(抽象周期)ginn的抽象过程由如下三个基本运算组成:分区(记为ρ)、升阶
(记为η)和降阶(记为λ),所述抽象过程为((ρ

η)*

ρ
′→


ρ)*)*,其中|(ρ

η)*|=|(λ

ρ)*|,ρ

表示最高阶图上的分区运算,在这种情况下,图本身就是一个区间;
[0057]
综上所述,ginn采用控制流图作为程序表示,首先所述ginn使用升阶运算符来增加图的阶,这使得在区间内更多的节点可以一起进行通信,然后通过应用降阶操作,所述ginn在低阶图上更新在高阶图上进行局部信息传播后的节点状态,并最终恢复到原始控制流图上的节点状态,值得一提的是,升阶和降阶操作是互补的,所述升阶和降阶的结合有益于ginn的总体学习目标,具体来说,升阶运算符使ginn可以捕获图的全局属性,而降阶运算符则可以帮助ginn计算精确的节点表示形式,随着所述升阶运算符号降阶运算符之间的交织继续进行,节点表示将不断得到完善以更好地反映图的性质;源代码抽象:本发明旨在阐述上述的图抽象方法在源代码级别上的含义,以及为什么所述图抽象方法可以帮助ginn更好地学习程序,由于区间在图抽象方法的所有三个运算符中都起着至关重要的作用,因此必须了解区间在程序中所代表的含义,作为一种简单而有效的方法,本发明借助一个与图2(a)具有相同的控制流图的程序,用以展示区间与什么代码结构相关,并阐述这个方法在源码级别是如何工作的,所述程序如图3所示,所述程序计算字符串s2中子字符串s1的起始索引,回顾ginn在一阶图上处理的唯一一个区间(由节点3~6组成),所述区间也就是函数中的内层的do-while语句,换句话说,当从一阶图学习时,ginn只专注于最内层的循环结构,类似地,节点2,7和8组成了ginn在第二阶图上所学习的唯一区间,这个区间恰好是外层的do-while循环;最后ginn遍历整个程序,因为节点1和节点9覆盖了一阶图中的每个节点,图3说明了ginn在一、二和三阶图之间的转换情况,尤其是在每个阶图上的不同之处;
[0058]
ginn的优势:图的抽象方法将源码转换为基于循环的抽象表示,所述抽象方法将程序抽象为层次结构,其中每层都提供了独特的循环结构供模型学习,由于循环是程序的必要组成部分,因此这种基于循环的抽象方案可帮助ginn基于程序的核心去学习其特征表示;在可扩展性方面,图抽象方法也提供了至关重要的优势,给定抽象的程序图,即使没有手动设计特殊的边,ginn也会侧重于一系列区间,降低需要长距离传播的信息数目,从而显着增强了ginn从在大图上的归纳能力,而这是现有gnn难以解决的一个挑战。
[0059]
四、程序分析
[0060]
给定一个程序,借助程序分析技术生成对应控制流图信息,gnn和ginn模型的输入是图的形式,虽然控制流图是程序的一种图表示,但是需要设计额外方式表示每个基本块、每条语句、甚至每个表达式,因此,本方法基于程序分析技术,提出一种新的程序表示方法,方法具体如下:
[0061]
基于图的程序表示:给定一个函数,通过分析程序得到所述函数的控制流图,然后将每个基本块拆分为多个节点,每个节点都是基本块内的一条语句,所以这种方式能够分析到具体的语句;在分析一个函数时,还通过将所述函数所有调用者和被调用者拼接到所述函数的图中,以此来包含所述函数的上下文关系;关于每个节点的初始状态,本方法实施例先获取所述节点对应的语句,再分析出该语句对应的ast,最后通过预定义的字典将所述ast中每一个节点转换成字典中的索引(用正整数表示),针对每一个节点vi,所述节点vi表示为(t1,t2,...,tj),其中j是节点的数目,tm,m∈{1,...,j}即是所述节点在字典中的索引;但是一个节点只由一个索引表示是不够的,所以额外引入rnn模型用于学习语句中每一个节点的向量表示,最后以所述rnn模型的最终的隐藏状态作为各个节点的初始状态;
[0062]
一般来说,上述的程序表示方法已经可以表示一个程序和对应程序性质,但是由于一些如数据竞争缺陷这种程序并发性相关的性质,是由于两个线程同时访问一个内存区域导致的,因此,通过控制流图表示一个函数的时候,还需要引入一条特殊的边连接这两个函数的控制流图,本实施例采用的连接方法是将这两个控制流图的入口节点相连,用来表示需要通过模型判断这两个函数是否会出现数据竞争;
[0063]
最后,将基于程序分析得到的程序表示图,传递给程序性质预测模块。
[0064]
五、程序性质预测
[0065]
ginn先计算出每个节点的状态向量,然后通过汇总所有节点的状态计算整个图的最终表示,之后,训练前馈神经网络来预测(使用整个图的表示)某个程序是否是有特定的程序性质。
[0066]
以上所述为本发明的实施例,但此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。凡在不脱离本发明的原理和精神的情况下依本发明申请专利范围所做的任何省略、修改、等同替换等,均应包含在本公开的保护范围之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献