CN114064487A - 一种代码缺陷检测方法 - Google Patents
一种代码缺陷检测方法 Download PDFInfo
- Publication number
- CN114064487A CN114064487A CN202111369107.XA CN202111369107A CN114064487A CN 114064487 A CN114064487 A CN 114064487A CN 202111369107 A CN202111369107 A CN 202111369107A CN 114064487 A CN114064487 A CN 114064487A
- Authority
- CN
- China
- Prior art keywords
- statement
- code
- vector
- slice
- program
- 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 158
- 238000001514 detection method Methods 0.000 title claims abstract description 73
- 239000013598 vector Substances 0.000 claims abstract description 109
- 238000000034 method Methods 0.000 claims abstract description 40
- 238000012549 training Methods 0.000 claims abstract description 11
- 230000006870 function Effects 0.000 claims description 58
- 239000011159 matrix material Substances 0.000 claims description 18
- 238000012163 sequencing technique Methods 0.000 claims description 3
- 238000013522 software testing Methods 0.000 abstract description 3
- 238000004458 analytical method Methods 0.000 description 8
- 238000010801 machine learning Methods 0.000 description 5
- 238000013528 artificial neural network Methods 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000013527 convolutional neural network Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000011218 segmentation Effects 0.000 description 2
- 241000700159 Rattus Species 0.000 description 1
- 230000002411 adverse Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000013135 deep learning Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000018109 developmental process Effects 0.000 description 1
- 230000009977 dual effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 238000005206 flow analysis Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 230000008439 repair process Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Health & Medical Sciences (AREA)
- Biomedical Technology (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- Biophysics (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Computational Linguistics (AREA)
- Artificial Intelligence (AREA)
- Mathematical Physics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种代码缺陷检测方法,属于软件测试技术领域,能够提高代码缺陷检测的准确率。方法包括:根据预设切片准则对待识别代码进行切片处理,得到待检测切片代码段;输入所述待检测切片代码段至预设代码缺陷检测模型,将所述预设代码缺陷检测模型的输出结果作为代码缺陷检测结果;其中,所述预设代码缺陷检测模型是通过对训练阶段的各切片代码段中的语句语义向量和语句类型向量进行分段学习,得到的网络模型。
Description
技术领域
本发明涉及软件测试技术领域,尤其涉及一种代码缺陷检测方法。
背景技术
代码分析和软件测试是检查并发现软件代码中的安全缺陷和利用途径的主要手段,一直是信息安全和软件安全领域的研究热点。但是随着安全关键和敏感系统的复杂程度越来越高、规模越来越庞大,以及软件缺陷的频发和黑客攻击手段的不断攀升,软件缺陷检测的难度也越来越大。传统的代码缺陷检测方法,难以兼顾较高的检测能力和检测效率,无法满足缩短软件维护周期、提高软件质量和可靠性的需要。
现有的代码缺陷检测方法主要有基于词法语法规则的和基于机器学习的缺陷检测。基于规则的缺陷检测方法由专家根据缺陷的类型编写各类缺陷规则,在对词法、语法解析和对源代码建模的基础上,进行数据流分析、污点分析等。常见的基于规则的软件缺陷检测工具有ITS4、RATS、Flawfinder等开源工具,以及部分商业工具。基于机器学习的缺陷检测方法根据专家定义的缺陷类型数据库,学习不同缺陷类型的特征,形成深度学习网络,进而检测并区分代码中的缺陷。
基于词法语法规则的缺陷检测方法中缺陷规则的生成对专家的依赖性强,存在较大的主观因素影响。这类方法对已形成规则的缺陷检测精确度较高,但由于人工定义的缺陷规则范围有限,很难对缺陷类型进行全方位的覆盖,规则的不完善导致较高的误报率和漏报率。
基于机器学习的缺陷检测方法对于缺陷数据库质量的依赖性较强,但随着代码检测系统的完善,数据库的数量与质量都得到了提升,是一种具有发展潜力的方法。除此之外,基于机器学习方法的检测水平取决于特征提取的方法与机器学习的网络结构。现有方法一般基于CNN或LSTM等网络,与基于规则的方法相比更为有效,但在缺陷检测的准确率、误报和漏报方面仍有提升空间。
发明内容
鉴于上述的分析,本发明实施例旨在提供一种代码缺陷检测方法,能够提高代码缺陷检测的准确率。
本发明公开了一种代码缺陷检测方法,包括:
根据预设切片准则对待识别代码进行切片处理,得到待检测切片代码段;
输入所述待检测切片代码段至预设代码缺陷检测模型,将所述预设代码缺陷检测模型的输出结果作为代码缺陷检测结果;其中,所述预设代码缺陷检测模型是通过对训练阶段的各切片代码段中的语句语义向量和语句类型向量进行分段学习,得到的网络模型。
进一步地,在所述根据预设切片准则对待识别代码进行切片处理,得到待检测切片代码段的步骤之前,所述代码缺陷检测方法还包括:
确定基于源代码的目标缺陷候选关键节点;所述目标缺陷候选关键节点包括与函数参数相关的缺陷候选关键节点和与函数返回值相关的缺陷候选关键节点;
以各目标缺陷候选关键节点为起点,按照程序依赖图中的依赖关系分别从前向和后向遍历所述程序依赖图,得到所述切片代码段。
进一步地,所述以各目标缺陷候选关键节点为起点,按照程序依赖图中的依赖关系分别从前向和后向遍历所述程序依赖图,得到所述切片代码段,包括:
将从前向遍历所述程序依赖图得到的前向切片语句节点集合,以及从后向遍历所述程序依赖图得到的后向切片语句节点集合合并,得到切片语句节点集合;
根据所述依赖关系和程序切片内语句顺序对所述切片语句节点集合中的所有切片语句节点进行排序,得到所述切片代码段。
进一步地,所述从前向遍历所述程序依赖图得到前向切片语句节点集合,包括:
按照所述依赖关系前向遍历所述程序依赖图,得到节点间前向切片语句节点集合;
获取切片中的函数调用语句调用的函数,以所述函数中与所述函数参数对应类型的节点为起点,前向遍历所述程序依赖图,获得过程间前向切片语句节点集合;
将所述节点间前向切片语句节点集合和所述过程间前向切片语句节点集合合并,得到所述前向切片语句节点集合。
进一步地,所述从后向遍历所述程序依赖图得到后向切片语句节点集合,包括:
按照所述依赖关系后向遍历所述程序依赖图,得到节点间后向切片语句节点集合;
获取切片中的函数调用语句调用的函数,以所述函数中与所述函数返回值对应类型的节点为起点,后向遍历所述程序依赖图,获得过程间后向切片语句节点集合;
将所述节点间后向切片语句节点集合和所述过程间后向切片语句节点集合合并,得到所述后向切片语句节点集合。
进一步地,所述代码缺陷检测方法还包括:
在所述语句语义向量和所述语句类型向量都完成分段学习后,将此时的所述语句语义向量和所述语句类型向量进行拼接,并映射到相同的特征空间中,得到各切片代码段的语句向量表示。
进一步地,所述通过对训练阶段的各切片代码段中的语句语义向量和语句类型向量进行分段学习,包括:
将各切片代码段中的语句拆分为token,使用预训练好的word2vec模型得到每个token的向量表示,得到token向量矩阵;
输入所述token向量矩阵至self-attention中,得到初始化语句语义向量矩阵;
通过语句编码网络对所述初始化语句语义向量矩阵进行表示学习,得到所述语句语义向量;
将各切片代码段中的语句的类型信息进行one-hot编码,得到所述语句类型向量。
进一步地,在所述得到各切片代码段的语句向量表示的步骤之后,所述代码缺陷检测方法还包括:
输入所述语句向量表示至程序编码网络,并通过所述程序编码网络对各切片代码段进行表示学习,得到全部切片代码段的向量表示。
进一步地,所述通过所述程序编码网络对各切片代码段进行表示学习,得到全部切片代码段的向量表示,包括:
对所述语句向量表示进行padding,得到包括所述语句向量的初始化程序向量矩阵;
通过所述程序编码网络对所述初始化程序向量矩阵进行表示学习,得到程序语句的隐藏向量;
随机初始化一个和程序语句的隐藏向量同维度的向量,通过线性层将程序语句的隐藏向量转化成可学习的查询向量;
利用所述查询向量计算各切片代码段中每条语句的注意力分数,使用softmax对同一切片代码段中语句的注意力分数进行归一化处理,得到语句最终的注意力值;
针对每一个切片代码段,利用语句最终的注意力值对所述语句的程序语句的隐藏向量进行加权求和,得到所述全部切片代码段的向量表示。
进一步地,所述预设切片准则为根据任意一种或多种缺陷关键节点对待识别代码进行切片处理的规则;其中,所述缺陷关键节点包括:
与API/库函数调用相关的缺陷关键节点、与指针使用相关的缺陷关键节点、与数组使用相关的缺陷关键节点、与算术表达式相关的缺陷关键节点、与函数参数相关的缺陷关键节点和与函数返回值相关的缺陷关键节点。
与现有技术相比,本发明至少可实现如下有益效果之一:
本发明实施例中提供的代码缺陷检测方法,根据预设切片准则对待识别代码进行切片处理,得到待检测切片代码段;输入待检测切片代码段至预设代码缺陷检测模型,将预设代码缺陷检测模型的输出结果作为代码缺陷检测结果。能够提高代码缺陷检测的准确率。
提供了两类新的与函数间数据传递相关的切片准则,相比于原有的四类切片准则,引入新的切片准则和过程间分析,能够产生更为丰富的缺陷候选关键点,进一步提高了切片代码段对代码缺陷语句的覆盖率,同时有助于降低检测模型对跨函数缺陷的漏报。
相比于用源代码训练代码缺陷检测模型,通过切片代码段训练代码缺陷检测模型,能够避免源代码中大量与缺陷无关语句对模型训练的不利影响,有助于提高代码缺陷检测模型的准确率,同时还降低了学习模型的复杂度,有助于提高模型训练的效率。
利用分段表示学习并结合基于token和语句的双重注意力机制,对切片代码段进行表示学习,利用语句编码网络和程序编码网络对切片代码段进行建模,相比于传统的深度神经网络,带有token和语句双重注意力机制的分段编码网络,能够融合局部和全局的特征信息,有效学习不同token和不同语句对缺陷的重要程度,更准确地学习切片代码段的向量表示,有助于提高代码缺陷检测模型的准确率。
能够通过融合切片代码段的缺陷识别结果获得函数级的代码缺陷识别结果,从而将缺陷同时定位到函数级和切片级,有助于辅助开发者理解和快速修复缺陷。
本发明中,上述各技术方案之间还可以相互组合,以实现更多的优选组合方案。本发明的其他特征和优点将在随后的说明书中阐述,并且,部分优点可从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过说明书以及附图中所特别指出的内容中来实现和获得。
附图说明
附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。
图1为本发明实施例中的代码缺陷检测方法流程图;
图2为本发明另一实施例中的代码缺陷检测方法流程图;
图3为本发明实施例中的生成切片代码段流程示意图;
图4为本发明实施例中的生成语句向量流程示意图。
具体实施方式
下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理,并非用于限定本发明的范围。
本发明的一个具体实施例,公开了一种代码缺陷检测方法,流程图如图1所示,包括以下步骤:
步骤S1:根据预设切片准则对待识别代码进行切片处理,得到待检测切片代码段。
步骤S2:输入所述待检测切片代码段至预设代码缺陷检测模型,将所述预设代码缺陷检测模型的输出结果作为代码缺陷检测结果;其中,所述预设代码缺陷检测模型是通过对训练阶段的各切片代码段中的语句语义向量和语句类型向量进行分段学习,得到的网络模型。
需要说明的是,本发明实施例中的“缺陷”与附图中的“漏洞”相对应。
在步骤S1中,进一步地,预设切片准则为根据任意一种或多种缺陷关键节点对待识别代码进行切片处理的规则。
上述缺陷关键节点包括:
与API/库函数调用相关的缺陷关键节点、与指针使用相关的缺陷关键节点、与数组使用相关的缺陷关键节点、与算术表达式相关的缺陷关键节点、与函数参数(FunctionParameter,FP)相关的缺陷关键节点和与函数返回值(Function Return statement,FR)相关的缺陷关键节点;后两种缺陷关键节点为本发明实施例新增的缺陷关键节点。
对于待识别代码,可以根据这六种切片准则,生成其所有可能的待检测切片代码段。
进一步的,在步骤S1之前,所述代码缺陷检测方法还包括:
确定基于源代码的目标缺陷候选关键节点;所述目标缺陷候选关键节点包括与函数参数相关的缺陷候选关键节点和与函数返回值相关的缺陷候选关键节点;需要说明的是,该步骤中的与函数参数相关的缺陷候选关键节点和与函数返回值相关的缺陷候选关键节点是与预设代码缺陷检测模型在训练阶段对应的。
上述与函数参数相关的缺陷关键节点和与函数返回值相关的缺陷关键节点是与预设代码缺陷检测模型在检测阶段对应的。
如图2所示,在确定基于源代码的目标缺陷候选关键节点的步骤之前,还包括如下两个步骤:
步骤一:利用静态分析工具解析源代码,生成以抽象语法树和程序依赖图联合表示的代码结构信息;以代码语句内容、节点类型和节点度数表示节点属性信息的代码属性图。
其中,抽象语法树如图3中的AST、程序依赖图如图3中的PDG,节点属性信息如图3中property。
步骤二:根据代码属性图中边的类型提取语句节点之间的数据依赖关系、控制依赖关系和函数依赖关系,生成程序依赖图。
确定与函数参数相关的缺陷候选关键节点,包括:
遍历步骤一中生成的代码属性图,查找类型为“Function”的节点,继续遍历以该节点为起点的边,并获得该边的终止节点。这些终止节点中类型为“Parameter”的节点即为与函数参数相关的缺陷候选关键节点。
确定与函数返回值相关的缺陷候选关键节点,包括:
遍历步骤一中生成的代码属性图,查找类型为“returnstatement”的节点,该节点即为与函数返回值相关的缺陷候选关键节点。
以各目标缺陷候选关键节点为起点,按照程序依赖图中的依赖关系分别从前向和后向遍历所述程序依赖图,得到所述切片代码段。
进一步地,所述以各目标缺陷候选关键节点为起点,按照程序依赖图中的依赖关系分别从前向和后向遍历所述程序依赖图,得到所述切片代码段,包括:
将从前向遍历所述程序依赖图得到的前向切片语句节点集合,以及从后向遍历所述程序依赖图得到的后向切片语句节点集合合并,得到切片语句节点集合;
根据所述依赖关系和程序切片内语句顺序对所述切片语句节点集合中的所有切片语句节点进行排序,得到所述切片代码段。该依赖关系可以包括控制依赖关系、数据依赖关系和函数调用依赖关系等。如图3所示,程序切片内语句顺序可以通过提取property信息获得。
进一步地,所述从前向遍历所述程序依赖图得到前向切片语句节点集合,包括:
按照所述依赖关系前向遍历所述程序依赖图,得到节点间前向切片语句节点集合;以每个缺陷候选关键节点为起点,按照依赖关系前向遍历程序依赖图,获得前向切片语句节点集合,此处的缺陷候选关键节点包括与函数参数相关的缺陷候选关键节点中的每个缺陷候选关键节点。
获取切片中的函数调用语句调用的函数,以所述函数中与所述函数参数对应类型的节点为起点,前向遍历所述程序依赖图,获得过程间前向切片语句节点集合;以该函数中类型为“Parameter”的节点为起点,前向遍历程序依赖图,获得过程间前向切片语句节点集合。
将所述节点间前向切片语句节点集合和所述过程间前向切片语句节点集合合并,得到所述前向切片语句节点集合。
进一步地,所述从后向遍历所述程序依赖图得到后向切片语句节点集合,包括:
按照所述依赖关系后向遍历所述程序依赖图,得到节点间后向切片语句节点集合;以每个缺陷候选关键节点为起点,按照依赖关系后向遍历程序依赖图,获得后向切片语句节点集合,此处的缺陷候选关键节点包括与函数返回值相关的缺陷候选关键节点中的每个缺陷候选关键节点。
获取切片中的函数调用语句调用的函数,以所述函数中与所述函数返回值对应类型的节点为起点,后向遍历所述程序依赖图,获得过程间后向切片语句节点集合;以该函数中类型为“returnstatement”的节点为起点,后向遍历程序依赖图,获得过程间后向切片语句节点集合。
将所述节点间后向切片语句节点集合和所述过程间后向切片语句节点集合合并,得到所述后向切片语句节点集合。
在步骤S2中,如图2所示,预设代码缺陷检测模型对应训练完成的缺陷检测模型,该模型在进行检测阶段之前,其中的语句编码网络(SENet)、程序编码网络(PENet)和检测器网络(DNet)都需要不断调整网络参数,直到收敛。
语句语义向量和语句类型向量可以通过对语句进行处理得到,如图2所示,对语句语义向量和语句类型向量进行分段学习的步骤在语句编码网络中进行。
如图4所示,通过self-attention对语句语义向量进行分段学习,通过One-Hot编码对语句类型向量进行分段学习。
进一步地,该步骤包括:
将各切片代码段中的语句拆分为token,使用预训练好的word2vec模型得到每个token的向量表示,得到token向量矩阵;在词法分析中token即是标记的意思。
word2vec,是一群用来产生词向量的相关模型。这些模型为双层的神经网络,用来训练以重新建构语言学的词文本。
输入所述token向量矩阵至self-attention中,得到初始化语句语义向量矩阵;参照图2,self-attention位于训练阶段中语句编码网络中。
通过语句编码网络对所述初始化语句语义向量矩阵进行表示学习,得到所述语句语义向量;参照图2,语句编码网络可选为CNN和RNN等。如图4所示,xi se为语句语义向量。
将各切片代码段中的语句的类型信息进行one-hot编码,得到所述语句类型向量。独热编码即One-Hot编码,又称一位有效编码。如图4所示,xi type为语句类型向量。
进一步地,所述代码缺陷检测方法还包括:
在所述语句语义向量和所述语句类型向量都完成分段学习后,将此时的所述语句语义向量和所述语句类型向量进行拼接,并映射到相同的特征空间中,得到各切片代码段的语句向量表示。如图4所示,将xi se和xi type进行拼接,输入线性层,通过线性层输出语句特征向量。
本发明实施例将语句语义向量和语句类型向量进行拼接,使得预设代码缺陷检测模型能够基于语句语义和语句类型进行代码缺陷检测,且语句语义和语句类型是经过单独学习的,使得预设代码缺陷检测模型的输出结果更加准确。向量进行拼接的方法为本领域成熟技术,不再赘述。
可以通过MLP映射到相同的特征空间中,得到各切片代码段的语句向量表示,如图4中的语句特征向量。典型的多层感知器MLP包括三层:输入层、隐层和输出层,MLP神经网络不同层之间是全连接的。映射到特征空间的方法也是本领域成熟技术,不再赘述。
进一步地,在所述得到各切片代码段的语句向量表示的步骤之后,所述代码缺陷检测方法还包括:
输入所述语句向量表示至程序编码网络,并通过所述程序编码网络对各切片代码段进行表示学习,得到全部切片代码段的向量表示。程序编码网络可选为BiGRU,BiGRU可分为三部分:文本向量化输入层、隐含层和输出层。其中,隐含层由BiGRU层、attention层和Dense层(全连接层)三层构成。
进一步地,所述通过所述程序编码网络对各切片代码段进行表示学习,得到全部切片代码段的向量表示,包括:
对所述语句向量表示进行padding,得到包括所述语句向量的初始化程序向量矩阵;padding是增加各个边的像素的数量,目的是保持feature map不要太小,但也没必要超过原图的大小。
通过所述程序编码网络对所述初始化程序向量矩阵进行表示学习,得到程序语句的隐藏向量。
随机初始化一个和程序语句的隐藏向量同维度的向量,通过线性层将程序语句的隐藏向量转化成可学习的查询向量;线性层的数量可以为一层。
利用所述查询向量计算各切片代码段中每条语句的注意力分数,使用softmax对同一切片代码段中语句的注意力分数进行归一化处理,得到语句最终的注意力值;如图2所示,根据文本注意力机制(对应图2中Text-Attention),利用所述查询向量计算各切片代码段中每条语句的注意力分数。
针对每一个切片代码段,利用语句最终的注意力值对所述语句的程序语句的隐藏向量进行加权求和,得到所述全部切片代码段的向量表示。
进一步地,参照图2,在该步骤之后,可以将得到的全部切片代码段的向量表示送入检测器网络中的全连接层和softmax层,得到前向计算结果,利用切片代码段的类别标签信息计算交叉熵损失函数,根据前向计算结果和交叉熵损失函数计算结果之间的误差,反向传播调整网络参数,直到语句编码网络、程序编码网络和检测器网络都收敛,该步骤为现有成熟技术。
与现有技术相比,本发明实施例中提供的代码缺陷检测方法,根据预设切片准则对待识别代码进行切片处理,得到待检测切片代码段;输入待检测切片代码段至预设代码缺陷检测模型,将预设代码缺陷检测模型的输出结果作为代码缺陷检测结果。能够提高代码缺陷检测的准确率。
本发明实施例通过引入新的切片准则,并生成切片代码段,更全面地覆盖缺陷候选关键点,更精准地提取与缺陷候选关键点有依赖关系的切片语句信息、属性信息和代码上下文信息。
此外,利用语句编码网络和程序编码网络,并结合基于token和语句的双重注意力机制,对切片代码段进行分段表示学习,以学习更全面、更准确的缺陷模式。
本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。
Claims (10)
1.一种代码缺陷检测方法,其特征在于,包括:
根据预设切片准则对待识别代码进行切片处理,得到待检测切片代码段;
输入所述待检测切片代码段至预设代码缺陷检测模型,将所述预设代码缺陷检测模型的输出结果作为代码缺陷检测结果;其中,所述预设代码缺陷检测模型是通过对训练阶段的各切片代码段中的语句语义向量和语句类型向量进行分段学习,得到的网络模型。
2.根据权利要求1所述的代码缺陷检测方法,其特征在于,在所述根据预设切片准则对待识别代码进行切片处理,得到待检测切片代码段的步骤之前,所述代码缺陷检测方法还包括:
确定基于源代码的目标缺陷候选关键节点;所述目标缺陷候选关键节点包括与函数参数相关的缺陷候选关键节点和与函数返回值相关的缺陷候选关键节点;
以各目标缺陷候选关键节点为起点,按照程序依赖图中的依赖关系分别从前向和后向遍历所述程序依赖图,得到所述切片代码段。
3.根据权利要求2所述的代码缺陷检测方法,其特征在于,所述以各目标缺陷候选关键节点为起点,按照程序依赖图中的依赖关系分别从前向和后向遍历所述程序依赖图,得到所述切片代码段,包括:
将从前向遍历所述程序依赖图得到的前向切片语句节点集合,以及从后向遍历所述程序依赖图得到的后向切片语句节点集合合并,得到切片语句节点集合;
根据所述依赖关系和程序切片内语句顺序对所述切片语句节点集合中的所有切片语句节点进行排序,得到所述切片代码段。
4.根据权利要求3所述的代码缺陷检测方法,其特征在于,所述从前向遍历所述程序依赖图得到前向切片语句节点集合,包括:
按照所述依赖关系前向遍历所述程序依赖图,得到节点间前向切片语句节点集合;
获取切片中的函数调用语句调用的函数,以所述函数中与所述函数参数对应类型的节点为起点,前向遍历所述程序依赖图,获得过程间前向切片语句节点集合;
将所述节点间前向切片语句节点集合和所述过程间前向切片语句节点集合合并,得到所述前向切片语句节点集合。
5.根据权利要求3所述的代码缺陷检测方法,其特征在于,所述从后向遍历所述程序依赖图得到后向切片语句节点集合,包括:
按照所述依赖关系后向遍历所述程序依赖图,得到节点间后向切片语句节点集合;
获取切片中的函数调用语句调用的函数,以所述函数中与所述函数返回值对应类型的节点为起点,后向遍历所述程序依赖图,获得过程间后向切片语句节点集合;
将所述节点间后向切片语句节点集合和所述过程间后向切片语句节点集合合并,得到所述后向切片语句节点集合。
6.根据权利要求1至5任一所述的代码缺陷检测方法,其特征在于,所述代码缺陷检测方法还包括:
在所述语句语义向量和所述语句类型向量都完成分段学习后,将此时的所述语句语义向量和所述语句类型向量进行拼接,并映射到相同的特征空间中,得到各切片代码段的语句向量表示。
7.根据权利要求6所述的代码缺陷检测方法,其特征在于,所述通过对训练阶段的各切片代码段中的语句语义向量和语句类型向量进行分段学习,包括:
将各切片代码段中的语句拆分为token,使用预训练好的word2vec模型得到每个token的向量表示,得到token向量矩阵;
输入所述token向量矩阵至self-attention中,得到初始化语句语义向量矩阵;
通过语句编码网络对所述初始化语句语义向量矩阵进行表示学习,得到所述语句语义向量;
将各切片代码段中的语句的类型信息进行one-hot编码,得到所述语句类型向量。
8.根据权利要求7所述的代码缺陷检测方法,其特征在于,在所述得到各切片代码段的语句向量表示的步骤之后,所述代码缺陷检测方法还包括:
输入所述语句向量表示至程序编码网络,并通过所述程序编码网络对各切片代码段进行表示学习,得到全部切片代码段的向量表示。
9.根据权利要求8所述的代码缺陷检测方法,其特征在于,所述通过所述程序编码网络对各切片代码段进行表示学习,得到全部切片代码段的向量表示,包括:
对所述语句向量表示进行padding,得到包括所述语句向量的初始化程序向量矩阵;
通过所述程序编码网络对所述初始化程序向量矩阵进行表示学习,得到程序语句的隐藏向量;
随机初始化一个和程序语句的隐藏向量同维度的向量,通过线性层将程序语句的隐藏向量转化成可学习的查询向量;
利用所述查询向量计算各切片代码段中每条语句的注意力分数,使用softmax对同一切片代码段中语句的注意力分数进行归一化处理,得到语句最终的注意力值;
针对每一个切片代码段,利用语句最终的注意力值对所述语句的程序语句的隐藏向量进行加权求和,得到所述全部切片代码段的向量表示。
10.根据权利要求1所述的代码缺陷检测方法,其特征在于,所述预设切片准则为根据任意一种或多种缺陷关键节点对待识别代码进行切片处理的规则;其中,所述缺陷关键节点包括:
与API/库函数调用相关的缺陷关键节点、与指针使用相关的缺陷关键节点、与数组使用相关的缺陷关键节点、与算术表达式相关的缺陷关键节点、与函数参数相关的缺陷关键节点和与函数返回值相关的缺陷关键节点。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111369107.XA CN114064487B (zh) | 2021-11-18 | 2021-11-18 | 一种代码缺陷检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111369107.XA CN114064487B (zh) | 2021-11-18 | 2021-11-18 | 一种代码缺陷检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114064487A true CN114064487A (zh) | 2022-02-18 |
CN114064487B CN114064487B (zh) | 2024-09-24 |
Family
ID=80277894
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111369107.XA Active CN114064487B (zh) | 2021-11-18 | 2021-11-18 | 一种代码缺陷检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114064487B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114969763A (zh) * | 2022-06-20 | 2022-08-30 | 哈尔滨工业大学 | 基于seq2seq代码表示学习的细粒度漏洞检测方法 |
CN114996149A (zh) * | 2022-06-16 | 2022-09-02 | 南京邮电大学 | 一种基于程序切片度量的代码缺陷预测方法 |
CN115629995A (zh) * | 2022-12-21 | 2023-01-20 | 中南大学 | 基于多依赖lstm的软件缺陷定位方法、系统及设备 |
CN118657177A (zh) * | 2024-08-13 | 2024-09-17 | 昆明理工大学 | 基于IEC61499标准的电路板缺陷识别Transformer网络分布式推理方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112699377A (zh) * | 2020-12-30 | 2021-04-23 | 哈尔滨工业大学 | 基于切片属性图表示学习的函数级代码漏洞检测方法 |
CN113297584A (zh) * | 2021-07-28 | 2021-08-24 | 四川大学 | 漏洞检测方法、装置、设备及存储介质 |
EP3893163A1 (en) * | 2020-04-09 | 2021-10-13 | Naver Corporation | End-to-end graph convolution network |
CN114969763A (zh) * | 2022-06-20 | 2022-08-30 | 哈尔滨工业大学 | 基于seq2seq代码表示学习的细粒度漏洞检测方法 |
-
2021
- 2021-11-18 CN CN202111369107.XA patent/CN114064487B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3893163A1 (en) * | 2020-04-09 | 2021-10-13 | Naver Corporation | End-to-end graph convolution network |
CN112699377A (zh) * | 2020-12-30 | 2021-04-23 | 哈尔滨工业大学 | 基于切片属性图表示学习的函数级代码漏洞检测方法 |
CN113297584A (zh) * | 2021-07-28 | 2021-08-24 | 四川大学 | 漏洞检测方法、装置、设备及存储介质 |
CN114969763A (zh) * | 2022-06-20 | 2022-08-30 | 哈尔滨工业大学 | 基于seq2seq代码表示学习的细粒度漏洞检测方法 |
Non-Patent Citations (3)
Title |
---|
PENG ZENG 等: ""Software Vulnerability Analysis and Discovery Using Deep Learning Techniques: A Survey"", pages 1 - 15, Retrieved from the Internet <URL:https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9244140> * |
候琳珊: "基于源代码中间表示的克隆检测研究", 中国优秀硕士学位论文全文数据库 (信息科技辑), 15 March 2022 (2022-03-15), pages 138 - 268 * |
张伟国: "基于代码语义向量表示和深度学习的软件漏洞检测方法", 中国优秀硕士学位论文全文数据库 (信息科技辑), 15 January 2021 (2021-01-15), pages 138 - 413 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114996149A (zh) * | 2022-06-16 | 2022-09-02 | 南京邮电大学 | 一种基于程序切片度量的代码缺陷预测方法 |
CN114996149B (zh) * | 2022-06-16 | 2024-05-28 | 南京邮电大学 | 一种基于程序切片度量的代码缺陷预测方法 |
CN114969763A (zh) * | 2022-06-20 | 2022-08-30 | 哈尔滨工业大学 | 基于seq2seq代码表示学习的细粒度漏洞检测方法 |
CN115629995A (zh) * | 2022-12-21 | 2023-01-20 | 中南大学 | 基于多依赖lstm的软件缺陷定位方法、系统及设备 |
CN118657177A (zh) * | 2024-08-13 | 2024-09-17 | 昆明理工大学 | 基于IEC61499标准的电路板缺陷识别Transformer网络分布式推理方法 |
Also Published As
Publication number | Publication date |
---|---|
CN114064487B (zh) | 2024-09-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112541180B (zh) | 一种基于语法特征和语义特征的软件安全漏洞检测方法 | |
CN114064487B (zh) | 一种代码缺陷检测方法 | |
CN112579477A (zh) | 一种缺陷检测方法、装置以及存储介质 | |
CN112215013B (zh) | 一种基于深度学习的克隆代码语义检测方法 | |
CN113326244B (zh) | 一种基于日志事件图和关联关系挖掘的异常检测方法 | |
CN113312464B (zh) | 一种基于对话状态追踪技术的事件抽取方法 | |
CN114936158B (zh) | 一种基于图卷积神经网络的软件缺陷定位方法 | |
CN112394973B (zh) | 一种基于伪孪生网络的多语言代码剽窃检测方法 | |
CN116661805B (zh) | 代码表示的生成方法和装置、存储介质及电子设备 | |
CN112200664A (zh) | 基于ernie模型和dcnn模型的还款预测方法 | |
CN116414948A (zh) | 基于云数据和人工智能的异常数据挖掘方法及软件产品 | |
CN116702160B (zh) | 一种基于数据依赖增强程序切片的源代码漏洞检测方法 | |
CN116305158A (zh) | 一种基于切片代码依赖图语义学习的漏洞识别方法 | |
CN114742016B (zh) | 一种基于多粒度实体异构图的篇章级事件抽取方法及装置 | |
CN114969763A (zh) | 基于seq2seq代码表示学习的细粒度漏洞检测方法 | |
CN116611071A (zh) | 一种基于多模态的函数级漏洞检测的方法 | |
CN116340952A (zh) | 一种基于操作码程序依赖图的智能合约漏洞检测方法 | |
CN118332559A (zh) | 基于分层源代码表示学习方法的跨语言漏洞检测系统 | |
Wu et al. | Novel slot detection: A benchmark for discovering unknown slot types in the task-oriented dialogue system | |
CN117591913A (zh) | 基于改进的R-Transformer的语句级软件缺陷预测方法 | |
CN113468327A (zh) | 一种基于深度学习的早期舆情检测方法 | |
CN114860945B (zh) | 基于规则信息的高质量噪音检测方法与装置 | |
CN115859307A (zh) | 基于树型注意力和加权图匹配的相似漏洞检测方法 | |
CN115587007A (zh) | 基于RoBERTa的网络日志安全检测方法及系统 | |
CN113988083A (zh) | 一种用于航运新闻摘要生成的事实性信息编码与评估方法 |
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 |