CN115758370A - 一种软件源代码缺陷检测方法、装置及存储介质 - Google Patents
一种软件源代码缺陷检测方法、装置及存储介质 Download PDFInfo
- Publication number
- CN115758370A CN115758370A CN202211099742.5A CN202211099742A CN115758370A CN 115758370 A CN115758370 A CN 115758370A CN 202211099742 A CN202211099742 A CN 202211099742A CN 115758370 A CN115758370 A CN 115758370A
- Authority
- CN
- China
- Prior art keywords
- layer
- source code
- defect detection
- cpg
- ggnn
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 230000007547 defect Effects 0.000 title claims abstract description 99
- 238000001514 detection method Methods 0.000 title claims abstract description 89
- 238000011176 pooling Methods 0.000 claims abstract description 51
- 238000000034 method Methods 0.000 claims abstract description 26
- 230000007246 mechanism Effects 0.000 claims abstract description 21
- 238000013138 pruning Methods 0.000 claims abstract description 19
- 239000013598 vector Substances 0.000 claims description 58
- 238000012549 training Methods 0.000 claims description 20
- 230000004931 aggregating effect Effects 0.000 claims description 6
- 238000004590 computer program Methods 0.000 claims description 3
- 230000002776 aggregation Effects 0.000 abstract description 8
- 238000004220 aggregation Methods 0.000 abstract description 8
- 230000008569 process Effects 0.000 abstract description 4
- 238000013522 software testing Methods 0.000 abstract description 2
- 230000006870 function Effects 0.000 description 16
- 238000010586 diagram Methods 0.000 description 10
- 238000013528 artificial neural network Methods 0.000 description 8
- 210000002569 neuron Anatomy 0.000 description 8
- 239000012634 fragment Substances 0.000 description 4
- 230000009466 transformation Effects 0.000 description 4
- 244000141353 Prunus domestica Species 0.000 description 3
- 230000004913 activation Effects 0.000 description 3
- 230000003044 adaptive effect Effects 0.000 description 2
- 238000012217 deletion Methods 0.000 description 2
- 230000037430 deletion Effects 0.000 description 2
- 230000007774 longterm Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 239000002131 composite material Substances 0.000 description 1
- 238000013527 convolutional neural network Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 239000011159 matrix material Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000003062 neural network model Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000000547 structure data Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Images
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种软件源代码缺陷检测方法、装置及存储介质,以解决现有的基于图的检测方法准确率低、漏报率高的问题,属于计算机软件测试技术领域。所述方法包括:获取源代码,生成所述源代码的初始CPG;对所述初始CPG进行剪枝,得到精简CPG;将所述精简CPG输入缺陷检测模型,以得到缺陷检测结果;其中,所述缺陷检测模型为基于注意力机制池化的GGNN网络模型。本发明利用基于注意力机制池化的GGNN网络模型构造缺陷检测模型处理经过剪枝操作的源代码CPG,能够获得更有效地全局节点聚合信息来表征整个输入的CPG,因此具有更加有效的缺陷检测能力。
Description
技术领域
本发明属于计算机软件测试技术领域,具体地,涉及一种软件源代码缺陷检测方法及装置。
背景技术
基于神经网络的软件源代码漏洞自动检测的主要困难在于源代码的有效特征表示和学习方法。为了能更有效地捕获源代码的语义和结构信息,可以应用图来表示源代码特征。典型的代码表示图有抽象语法树(AST)、控制流图(CFG)、数据流图(DFG)、程序依赖关系图(PDG)和代码属性图(CPG),CPG是结合AST、CFG和PDG的复合图表示。
随着代码表示图的提出和图神经网络(GNN)的进一步发展,基于图的源代码缺陷自动检测方法被提出。它嵌入代码表示图,生成作为输入的图结构向量表示,然后通过GNN得到代码表示图的高级特征表示,最后可以使用单个分类器进行漏洞分类。例如,中国专利文献CN114385512A公开了一种软件源代码缺陷检测方法,其根据源软件代码构造代码属性图,将代码属性图输入预设基于图神经网络的源代码缺陷检测模型,预设基于图神经网络的源代码缺陷检测模型用于生成自适应接收路径,并根据自适应接收路径输出检测结果,可以减少无关代码信息的影响,提高代码漏洞检测的效率。此外,中国专利文献CN113608747A公开了一种基于图卷积神经网络的软件缺陷预测方法,其通过将代码文件构成的数据集解析成抽象语法树(AST),并将调整后的抽象语法树构造成图结构构建训练集,尽可能保留源代码文件所包含的信息,来训练神经网络进行特征提取,然后利用提取到的代码信息,并结合与同缺陷相关的静态代码特征进行缺陷预测。
然而,目前基于GNN的代码缺陷检测方法仍然存在一些问题,例如现有的基于图的检测方法通常将GNN输出的所有节点的信息进行聚合,然后进行图级分类,用于缺陷检测的整个图形信息的聚合可能会受到不相关的冗余信息的影响,从而导致较低的准确率和较高的漏报率。
发明内容
根据本发明的一个方面,提供了一种软件源代码缺陷检测方法,包括:
获取源代码,生成所述源代码的初始CPG;
对所述初始CPG进行剪枝,得到精简CPG;
将所述精简代码属性图输入缺陷检测模型,以得到缺陷检测结果;
其中,所述缺陷检测模型为基于注意力机制池化的GGNN网络模型。
在另外的一个示例中,所述剪枝包括:从所述初始CPG中删除不包含 CFG或PDG边的AST节点及其相应的AST边。
在另外的一个示例中,所述基于注意力机制池化的GGNN网络模型包括输入层、GGNN层、基于注意力机制的池化层以及输出层,其中,所述池化层包括SAGPool层和全局池化层,所述SAGPool层用于从所述GGNN 层输出的图中获取关键的更新,并通过所述全局池化层对全局信息聚合,以获得最终节点的隐含状态的更新。
在另外的一个示例中,还包括对所述精简CPG进行符号表示及向量表示,在进行向量表示时,将源代码片段的每一个词都先转换成一个向量,然后将所有向量的值进行相加来得到整个源代码片段的向量表示,输入所述缺陷检测模型。
根据本发明的另一个方面,提供了一种软件源代码缺陷检测装置,包括:
CPG生成单元,用于获取源代码,生成所述源代码的初始CPG;
剪枝单元,用于对所述初始CPG进行剪枝,得到精简CPG;
缺陷检测单元,用于将所述精简代码属性图输入缺陷检测模型,以得到缺陷检测结果;其中,所述缺陷检测模型为基于注意力机制池化的GGNN 网络模型。
在另外的一个示例中,所述剪枝单元从所述初始CPG中删除不包含 CFG或PDG边的AST节点及其相应的AST边。
在另外的一个示例中,所述基于注意力机制池化的GGNN网络模型包括输入层、GGNN层、基于注意力机制的池化层以及输出层,其中,所述池化层包括SAGPool层和全局池化层,所述SAGPool层用于从所述GGNN 层输出的图中获取关键的更新,并通过所述全局池化层对全局信息聚合,以获得最终节点的隐含状态的更新。
在另外的一个示例中,所述缺陷检测单元还包括:
符号表示模块,用于提取所述精简CPG节点中的特征,并将其替换为对应的符号得到符号表示结果;
向量表示模块,用于将所述符号表示结果转换为向量表示结果;
其中,所述向量表示模块将源代码片段的每一个词都先转换成一个向量,然后将所有向量的值进行相加来得到整个源代码片段的向量表示,输入所述缺陷检测模型。
根据本发明的再一个方面,提供了一种软件源代码缺陷检测模型训练方法,包括:
从源代码提取出CPG作为源代码的初始图表示,根据一定的规则对 CPG进行剪枝操作得到精简后的CPG;
依据正则表达式提取精简后的CPG节点中的特征,并将其替换为对应的符号得到符号表示结果;
将符号表示结果作为word2vec工具的语料库进行词向量模型训练,利用训练好的词向量模型将符号表示结果转换为向量表示结果;
将向量表示结果作为训练样本来训练基于注意力机制池化的GGNN网络,得到能够对软件源代码缺陷进行检测的缺陷检测模型;
其中,所述基于注意力机制池化的GGNN网络模型包括输入层、GGNN 层、基于注意力机制的池化层以及输出层,其中,所述池化层包括SAGPool 层和全局池化层,所述SAGPool层用于从所述GGNN层输出的图中获取关键的更新,并通过所述全局池化层对全局信息聚合,以获得最终节点的隐含状态的更新。
此外,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如方案中任一项所述的软件源代码缺陷检测方法,或者所述的软件源代码缺陷检测模型训练方法。
本发明通过生成软件源代码的CPG,对初始CPG进行剪枝操作,删除不包含CFG或PDG边的AST节点及其相应的AST边得到精简的CPG。由于CPG将AST、CFG、PDG整合到一种数据结构中,并且删除了与代码缺陷无关的信息,相比于主要表达代码之间的语法关系AST能够表达更丰富的代码语义信息,从而更有助于捕捉缺陷代码的特征。
在此基础上,本发明利用基于注意力机制池化的GGNN网络模型构造缺陷检测模型,相比于图卷积网络(GCN)+CNN的结构,由于GGNN可以处理源代码之间的长期依赖关系,并且基于注意力机制的池化层可以更聚焦缺陷相关的节点构成的子图,而不是对全部节点进行信息聚合,最终能够获得更有效地全局节点聚合信息来表征整个输入的CPG,因此具有更加有效的缺陷检测能力。
此外,基于注意力的池化模型对精简CPG可以从高级特征表示中实现冗余信息约简,从而能够实现更高的缺陷检测精度。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其他特征、目的和优点将会变得更明显:
图1为根据本发明实施例的软件源代码缺陷检测方法工作流程示意图;
图2为源代码片段示例的初始CPG示意图;
图3为图2所示的初始CPG经过剪枝操作后得到的精简CPG示意图;
图4为根据本发明实施例的缺陷检测模型网络结构示意图;
图5为根据本发明实施例的软件源代码缺陷检测装置结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
根据本发明的一个实施方式,提供了一种软件源代码缺陷检测方法,如图1所示,该方法包括如下步骤:
步骤1、获取源代码,生成所述源代码的初始代码属性图;
CPG(code property graph,代码属性图)是一种数据结构,其将 AST(abstractsyntax trees)、CFG(control flow graphs)、PDG(program dependence graphs)整合到一种数据结构当中,包含以下组成部分:
节点及其类型:节点代表程序的组成部分,包含有底层语言的函数、变量、控制结构等,还有更抽象的HTTP终端等。每个节点都有一个类型,如类型METHOD代表是方法,而LOCAL代表是一个局部变量。
有向边及标签:节点之间的边代表它们之间的关系,而标签则是关系的说明。比如一个方法CONTAINS包含了一个局部变量。
键值对:节点带有键值对,即属性,键取决于节点的类型。比如一个方法至少会有一个方法名和一个签名,而一个局部变量至少有名字和类型。
例如,可以使用Joern工具生成软件源代码的CPG。首先,解析指定目录的源代码,然后用export命令将图导出到outdir文件夹下。其中,export 命令中的–repr指定为cpg14。
例如,下面的一段源代码片段示例,其对应的CPG如图2所示。
Sample 1
1:int setFilename(char*filename){
2:char name[20];
3:sprintf(name,“\%16s.dat”,filename);
4:int success=saveToDB(name);
5:return success;
6:}
该示例使用“sprintf”库函数将字符串变量复制到格式化的字符串变量,而原始字符串变量来自不受信任的源。但是,如果原始文件名正好是16个字符或更大,这将导致“Offby one”错误,因为具有文件扩展名的16个字符的格式正好是20个字符,并且没有考虑将放置在字符串末尾的所需空终止符。
图2所示的CPG中,不同的边关系被明显标记。CPG结合了AST、 CFG和PDG三个子图,可以表达该示例中的“sprintf”功能的丰富语义和语法信息。其中,所有节点都是AST节点,AST边主要提供节点的语法结构信息,其中CFG和PDG边提供关键节点的语义结构信息。
步骤2、对所述初始代码属性图进行剪枝,得到精简代码属性图;
从图2可以看出,有些AST节点没有子节点,只包含AST边。事实上, AST边主要提供CPG中节点的语法结构信息,然而,一些AST边通常与漏洞信息不密切相关。因此,可以从CPG中删除一些不包含CFG或PDG 边的AST节点和相应的AST边,以减少冗余信息,这有助于改进CPG信息表示的聚合。
修剪后的CPG如图3所示。显然,在删除冗余的AST相关信息后, CPG变得更加简化和集群化,突出显示关键节点(“sprintf”、“filename”) 以及与漏洞信息相关的相应边关系。此外,剩余的AST边用于提供关键节点之间的语法信息,这有助于丰富漏洞信息。
一个被描述为基于python编程语言的剪枝算法示例为:
其中,N表示节点集,节点按索引从小到大排序。E代表边集,d代表边类型,0、1、2分别代表AST、CFG、PDG的边类型。NR和ER分别表示需要删除的节点集和边集。
步骤3、将所述精简代码属性图输入缺陷检测模型,以得到缺陷检测结果。
如图4所示,本发明中的缺陷检测模型是基于注意力机制池化的GGNN (GatedGraph Neural Network,门控图神经网络),包括四层结构:
第1层为输入层,神经元个数与输入向量的维度相同,每个神经元依次对应向量的一个维度的输入并直接传给下一层神经元;
第2层为GGNN层,以门控循环单元(GRU)来更新GNN变换后的神经元隐含状态;
对于一个给定的嵌入图gi(V,X,E),每个节点的特征xi是一个低维向量,由word2vec以符号化节点表示输出。在式(1)中,对于每个节点vi∈V,hi 0代表节点i的初始隐藏状态,它填充额外的0以允许隐藏状态大于xi的大小。
hi 0=[xi||0] (1)
在式(2)中,ai t表示使用和函数的节点i的聚合信息,N(i)是节点i 的邻域集,t表示时间步长,Weij表示节点i及其邻域节点j的边特征,其由hi通过简单的线性变换获得:
ai t=∑j∈N(i)Weijhj t (2)
在等式(3)中,hi t+1表示第(t+1)时间步中节点i的隐藏状态,该时间步将at i和ht i作为GRU单元的输入。迭代之后在T步中,节点集V的最终节点表示矩阵可以是HT={hj T}n j=1。
hi t+1=GRU(at i,ht i) (3)
第3层为基于注意力机制的池化层,包含自注意力图池化层 (Self-AttentionGraph Pooling,SAGPool层)和全局池化层(GlobalPool 层)。其中,SAGPool层用于从GGNN输出的图中获取关键的更新,并通过GlobalPool层对全局信息聚合,获得最终节点的隐含状态的更新。
第4层为输出层,包含一个分类器,以输出缺陷检测结果,其数值取值为0和1,0表示不包含漏洞,1表示包含漏洞。
对于图级分类任务,给定一个图输入gi,通常的做法是对节点的所有更新特征求和,然后通过如式(4)所示的线性变换得到最终的分类结果。 sigmoid函数用于分类,其中MLP将HT映射到n维向量,Sigmoid是非线性激活函数。
yi=Sigmoid(∑MLP(HT)) (4)
池化层的目的是通过对节点进行下采样来减少参数的大小,从而生成更小的表示,从而避免过拟合、置换不变性和计算复杂性问题。同时,与漏洞相关的节点通常来自V的子集。
鉴于这些事实,直接对所有节点的更新特征进行求和可能会引入影响检测性能的不必要的噪声。因此,本发明以GGNN层输出作为输入,实现了基于自注意机制的池层SAGPool。该层可以从输入图中选择一个重要的节点集和相应的边作为子图。
Z=σ(GCN(gi,HT)) (5)
idx=top_rank(Z,[kN]),Zmask=Zidx (6)
在式(5)中,Z代表图中所有节点的自注意力分数,由GCN(Graph ConvolutionalNetwork,图卷积网络)用激活函数σ计算。在式(6)中,池化比率k∈(0,1]是一个超参数,用于确定要保留的节点数。[kN]的节点是根据Z的值选择的。top_rank是一个返回top[kN]节点索引的函数.idx是索引操作,其中Zmask是特征注意掩码。
该层的最终输出是HT的子集是Hg,表示关键子图中节点的特征。
然后,SAGPool层输出的子图输入到GlobalPool层以获得输入图的最终聚合信息。
ri=∑hN i=1softmax(hi g)ffeat(hi g) (7)
Hg Final=∑hN i=1hi gri (8)
在式(7)中,ri表示每个节点的重要性。softmax是一个非线性激活函数,可得到和为1的概率分布。本发明在这项工作中使用的ffeat是GCN,因为它可以学习编码局部图结构和节点特征的表示。
在获得所有节点的重要性后,使用一个和函数,将所有输入节点特征和相应的注意分数作为权重,计算出最终节点输出Hg Final,如式(8)所示。
最后,使用公式(4)得到缺陷检测输出,其中,Hg Final作为输入来代替 HT。
本发明中,缺陷检测模型包括使用GGNN的图嵌入层和包含SAGPool 层和GlobalPool层的池化层。GGNN用于从CPG中学习节点的更新特征,它可以改善图形结构中的长期信息传输,比普通GNN更适合于语义和图形结构的数据。SAGPool层基于自注意机制提取与漏洞信息密切相关的关键子图。然后SAGPool输出的子图输入到GlobalPool层,以全局注意力机制获得输入图的最终聚合信息。最后,通过分类器输出最终分类结果。此外,由于本发明使用GCN计算SAGPool和GlobalPool中的注意分数,因此能够同时考虑了图的节点和拓扑的特征。
为了使所述缺陷检测模型能够识别代码属性图,可以理解是,需要对所述精简属性图进行符号表示及向量表示。
所述符号表示用于将CPG每个节点中的漏洞特征(例如局部变量或用户定义函数)转换为一种短而固定的符号表示,包括三种符号化类型:变量符号化、函数符号化以及字符串符号化。在符号表示中,相同的特征映射到相同的符号表示形式。
所述向量表示可以使用word2vec模型实现。可以理解的是,需要对 word2vec模型利用源代码语料库进行预训练;预训练好的word2vec模型对代码属性图进行向量化得到节点代码向量化。
考虑CPG中节点包含的源代码片段大多长度较短,因此本发明没有采用“先预设长度,然后根据输入的长短进行删除和增补操作”的方式,而是将源代码片段的每一个词都先转换成一个向量,然后将所有向量的值进行相加来得到整个源代码片段的向量表示,作为缺陷检测模型的输入。采用这种方式可以最大限度的保留源代码片段的整体语义信息。
可以理解的是,所述缺陷检测模型是经过训练的神经网络模型。示例性地,具体训练过程包括:
1)首先从源代码提取出CPG(例如利用Joern工具)作为源代码的初始图表示,然后根据一定的规则对CPG进行剪枝操作得到精简后的CPG;
2)依据正则表达式提取精简CPG节点中的变量、函数、字符串等特征,并将其替换为对应的符号得到符号表示结果(文本);
3)将符号表示结果作为word2vec工具的语料库进行词向量模型训练,利用训练好的词向量模型将符号表示结果转换为向量表示结果;
4)将向量表示结果作为训练样本来训练基于注意力机制池化的GGNN 网络,得到能够自动进行缺陷检测的缺陷检测模型。
因此,本发明也提供了一种软件源代码缺陷检测模型训练方法,其采用上述训练过程对基于注意力机制池化的GGNN网络进行训练,以使其能够基于输入的精简CPG自动检测,并输出源代码缺陷检测结果。
其中,所述基于注意力机制池化的GGNN网络具有如图4所示的网络结构。
根据本发明的另一个实施方式,提供了一种软件源代码缺陷检测装置,如图5所示,该装置包括CPG生成单元61、剪枝单元62以及缺陷检测单元63,以下对上述单元进行具体描述。
所述CPG生成单元61用于获取源代码,生成所述源代码的初始代码属性图;
例如,所述CPG生成单元61可以使用Joern工具生成软件源代码的 CPG。具体地,首先解析指定目录的源代码,然后用export命令将图导出到outdir文件夹下。其中,export命令中的–repr指定为cpg14。
所述剪枝单元62用于对所述初始代码属性图进行剪枝,得到精简代码属性图;
具体地,所述剪枝单元62从初始CPG中删除一些不包含CFG或PDG 边的AST节点及其相应的AST边,以减少冗余信息,从而助于改进CPG 信息表示的聚合。
所述缺陷检测单元63用于将所述精简代码属性图输入经过训练的缺陷检测模型,以得到缺陷检测结果。
具体地,所述缺陷检测单元63包括符号表示模块631、向量表示模块 632以及缺陷检测模型633。
所述符号表示模块631用于依据正则表达式提取精简CPG节点中的变量、函数、字符串等特征,并将其替换为对应的符号得到符号表示结果(文本)。具体地,将精简的CPG每个节点中的漏洞特征(例如局部变量或用户定义函数)转换为一种短而固定的符号表示,包括三种符号化类型:变量符号化、函数符号化以及字符串符号化。
所述向量表示模块632使用word2vec模型实现。具体地,将符号表示结果作为word2vec工具的语料库进行词向量模型训练,利用训练好的词向量模型将符号表示结果转换为向量表示结果。
考虑CPG中节点包含的源代码片段大多长度较短,因此本发明没有采用“先预设长度,然后根据输入的长短进行删除和增补操作”的方式,而是将源代码片段的每一个词都先转换成一个向量,然后将所有向量的值进行相加来得到整个源代码片段的向量表示,作为缺陷检测模型的输入。采用这种方式可以最大限度的保留源代码片段的整体语义信息。
所述缺陷检测模型633采用基于注意力机制池化的GGNN网络,其输入所述将向量表示结果,输出缺陷检测结果。
如图4所示,所述缺陷检测模型633包括四层结构:
第1层为输入层,神经元个数与输入向量的维度相同,每个神经元依次对应向量的一个维度的输入并直接传给下一层神经元;
第2层为GGNN层,以门控循环单元(GRU)来更新GNN变换后的神经元隐含状态;
第3层为基于注意力机制的池化层,包含SAGPool层和GlobalPool层。其中,SAGPool层用于从GGNN输出的图中获取关键的更新,并通过 GlobalPool层对全局信息聚合,获得最终节点的隐含状态的更新。
第4层为输出层,包含一个分类器,以输出缺陷检测结果,其数值取值为0和1,0表示不包含漏洞,1表示包含漏洞。
在所述软件源代码缺陷检测装置中,各单元可以采用硬件电路实现,也可以采用与内置计算机指令的嵌入式***实现,该嵌入式***的处理器可以为中央处理器(CentralProcessing Unit,CPU),或者其他通用处理器、数字信号处理器(Digital SignalProcessor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。
根据本发明另外的实施方式,还公开了一种非暂态计算机可读存储介质,用于存储非暂态软件程序、非暂态计算机可执行程序以及模块,如本发明前述实施例中的软件源代码缺陷检测方法及软件源代码缺陷检测模型训练方法对应的程序或指令。处理器通过运行所述非暂态软件程序或指令,实现上述方法实施例中的软件源代码缺陷检测方法或软件源代码缺陷检测模型训练方法。
虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明发明构思的情况下,可以对本本发明实施例的技术方案进行修改或等同替换都不应脱离本发明实施例的技术方案的精神和范围。
Claims (10)
1.一种软件源代码缺陷检测方法,其特征在于,包括:
获取源代码,生成所述源代码的初始CPG;
对所述初始CPG进行剪枝,得到精简CPG;
将所述精简CPG输入缺陷检测模型,以得到缺陷检测结果;
其中,所述缺陷检测模型为基于注意力机制池化的GGNN网络模型。
2.根据权利要求1所述的软件源代码缺陷检测方法,其特征在于,所述剪枝包括:从所述初始CPG中删除不包含CFG或PDG边的AST节点及其相应的AST边。
3.根据权利要求1或2所述的软件源代码缺陷检测方法,其特征在于,所述基于注意力机制池化的GGNN网络模型包括输入层、GGNN层、基于注意力机制的池化层以及输出层,其中,所述池化层包括SAGPool层和全局池化层,所述SAGPool层用于从所述GGNN层输出的图中获取关键的更新,并通过所述全局池化层对全局信息聚合,以获得最终节点的隐含状态的更新。
4.根据权利要求1所述的软件源代码缺陷检测方法,其特征在于,还包括对所述精简CPG进行符号表示及向量表示,在进行向量表示时,将源代码片段的每一个词都先转换成一个向量,然后将所有向量的值进行相加来得到整个源代码片段的向量表示,输入所述缺陷检测模型。
5.一种软件源代码缺陷检测装置,其特征在于,包括:
CPG生成单元,用于获取源代码,生成所述源代码的初始CPG;
剪枝单元,用于对所述初始CPG进行剪枝,得到精简CPG;
缺陷检测单元,用于将所述精简代码属性图输入缺陷检测模型,以得到缺陷检测结果;其中,所述缺陷检测模型为基于注意力机制池化的GGNN网络模型。
6.根据权利要求5所述的软件源代码缺陷检测装置,其特征在于,所述剪枝单元从所述初始CPG中删除不包含CFG或PDG边的AST节点及其相应的AST边。
7.根据权利要求5或6所述的软件源代码缺陷检测装置,其特征在于,所述基于注意力机制池化的GGNN网络模型包括输入层、GGNN层、基于注意力机制的池化层以及输出层,其中,所述池化层包括SAGPool层和全局池化层,所述SAGPool层用于从所述GGNN层输出的图中获取关键的更新,并通过所述全局池化层对全局信息聚合,以获得最终节点的隐含状态的更新。
8.根据权利要求5所述的软件源代码缺陷检测装置,其特征在于,所述缺陷检测单元还包括:
符号表示模块,用于提取所述精简CPG节点中的特征,并将其替换为对应的符号得到符号表示结果;
向量表示模块,用于将所述符号表示结果转换为向量表示结果;
其中,所述向量表示模块将源代码片段的每一个词都先转换成一个向量,然后将所有向量的值进行相加来得到整个源代码片段的向量表示,输入所述缺陷检测模型。
9.一种软件源代码缺陷检测模型训练方法,其特征在于,包括:
从源代码提取出CPG作为源代码的初始图表示,根据一定的规则对CPG进行剪枝操作得到精简后的CPG;
依据正则表达式提取精简后的CPG节点中的特征,并将其替换为对应的符号得到符号表示结果;
将符号表示结果作为word2vec工具的语料库进行词向量模型训练,利用训练好的词向量模型将符号表示结果转换为向量表示结果;
将向量表示结果作为训练样本来训练基于注意力机制池化的GGNN网络,得到能够对软件源代码缺陷进行检测的缺陷检测模型;
其中,所述基于注意力机制池化的GGNN网络模型包括输入层、GGNN层、基于注意力机制的池化层以及输出层,其中,所述池化层包括SAGPool层和全局池化层,所述SAGPool层用于从所述GGNN层输出的图中获取关键的更新,并通过所述全局池化层对全局信息聚合,以获得最终节点的隐含状态的更新。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至4中任一项所述的软件源代码缺陷检测方法,或者如权利要求9所述的软件源代码缺陷检测模型训练方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211099742.5A CN115758370B (zh) | 2022-09-09 | 2022-09-09 | 一种软件源代码缺陷检测方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211099742.5A CN115758370B (zh) | 2022-09-09 | 2022-09-09 | 一种软件源代码缺陷检测方法、装置及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115758370A true CN115758370A (zh) | 2023-03-07 |
CN115758370B CN115758370B (zh) | 2024-06-25 |
Family
ID=85349731
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211099742.5A Active CN115758370B (zh) | 2022-09-09 | 2022-09-09 | 一种软件源代码缺陷检测方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115758370B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111783100A (zh) * | 2020-06-22 | 2020-10-16 | 哈尔滨工业大学 | 基于图卷积网络对代码图表示学习的源代码漏洞检测方法 |
WO2020252529A1 (en) * | 2019-06-19 | 2020-12-24 | Swinburne University Of Technology | System for automatically detecting software vulnerability |
WO2021148625A1 (en) * | 2020-01-23 | 2021-07-29 | Debricked Ab | A method for identifying vulnerabilities in computer program code and a system thereof |
CN113821799A (zh) * | 2021-09-07 | 2021-12-21 | 南京邮电大学 | 基于图卷积神经网络的恶意软件多标签分类方法 |
CN114238100A (zh) * | 2021-12-10 | 2022-03-25 | 国家电网有限公司客户服务中心 | 基于GGNN和分层注意力网络的Java漏洞检测定位方法 |
CN114385512A (zh) * | 2022-03-23 | 2022-04-22 | 北京北大软件工程股份有限公司 | 软件源代码缺陷检测方法及装置 |
-
2022
- 2022-09-09 CN CN202211099742.5A patent/CN115758370B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020252529A1 (en) * | 2019-06-19 | 2020-12-24 | Swinburne University Of Technology | System for automatically detecting software vulnerability |
WO2021148625A1 (en) * | 2020-01-23 | 2021-07-29 | Debricked Ab | A method for identifying vulnerabilities in computer program code and a system thereof |
CN111783100A (zh) * | 2020-06-22 | 2020-10-16 | 哈尔滨工业大学 | 基于图卷积网络对代码图表示学习的源代码漏洞检测方法 |
CN113821799A (zh) * | 2021-09-07 | 2021-12-21 | 南京邮电大学 | 基于图卷积神经网络的恶意软件多标签分类方法 |
CN114238100A (zh) * | 2021-12-10 | 2022-03-25 | 国家电网有限公司客户服务中心 | 基于GGNN和分层注意力网络的Java漏洞检测定位方法 |
CN114385512A (zh) * | 2022-03-23 | 2022-04-22 | 北京北大软件工程股份有限公司 | 软件源代码缺陷检测方法及装置 |
Non-Patent Citations (2)
Title |
---|
刘烨;黄金筱;马于涛;: "基于混合神经网络和注意力机制的软件缺陷自动分派方法", 计算机研究与发展, no. 03 * |
李元诚;崔亚奇;吕俊峰;来风刚;张攀;: "开源软件漏洞检测的混合深度学习方法", 计算机工程与应用, no. 11 * |
Also Published As
Publication number | Publication date |
---|---|
CN115758370B (zh) | 2024-06-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111783100B (zh) | 基于图卷积网络对代码图表示学习的源代码漏洞检测方法 | |
CN113011533B (zh) | 文本分类方法、装置、计算机设备和存储介质 | |
WO2021042503A1 (zh) | 信息分类抽取方法、装置、计算机设备和存储介质 | |
CN108446540B (zh) | 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与*** | |
US20220050967A1 (en) | Extracting definitions from documents utilizing definition-labeling-dependent machine learning background | |
CN113420296B (zh) | 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 | |
Brody et al. | A structural model for contextual code changes | |
EP4248309A1 (en) | Automated merge conflict resolution with transformers | |
CN112800776A (zh) | 双向gru关系抽取数据处理方法、***、终端、介质 | |
CN112597063B (zh) | 缺陷代码定位的方法、装置以及存储介质 | |
WO2022261570A1 (en) | Cross-attention system and method for fast video-text retrieval task with image clip | |
KR102405578B1 (ko) | 지식 그래프를 이용한 상황 인지형 다중 문장 관계 추출 방법 및 장치 | |
CN112215013A (zh) | 一种基于深度学习的克隆代码语义检测方法 | |
CN114816497B (zh) | 基于bert预训练模型的链接生成方法 | |
US11599666B2 (en) | Smart document migration and entity detection | |
CN114528898A (zh) | 基于自然语言命令的场景图修改 | |
Nikanjam et al. | Automatic fault detection for deep learning programs using graph transformations | |
CN116661852B (zh) | 一种基于程序依赖图的代码搜索方法 | |
CN117474010A (zh) | 面向电网语言模型的输变电设备缺陷语料库构建方法 | |
CN115268994B (zh) | 一种基于tbcnn和多头自注意力机制的代码特征提取方法 | |
CN116974554A (zh) | 代码数据处理方法、装置、计算机设备和存储介质 | |
CN115758370B (zh) | 一种软件源代码缺陷检测方法、装置及存储介质 | |
CN113626574A (zh) | 一种信息查询方法及***及装置及介质 | |
Li et al. | WELL: Applying Bug Detectors to Bug Localization via Weakly Supervised Learning | |
de Bruin et al. | Autoencoders as Tools for Program Synthesis |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |