CN109408389B - 一种基于深度学习的代码缺陷检测方法及装置 - Google Patents

一种基于深度学习的代码缺陷检测方法及装置 Download PDF

Info

Publication number
CN109408389B
CN109408389B CN201811278355.1A CN201811278355A CN109408389B CN 109408389 B CN109408389 B CN 109408389B CN 201811278355 A CN201811278355 A CN 201811278355A CN 109408389 B CN109408389 B CN 109408389B
Authority
CN
China
Prior art keywords
code
defect
detected
tool
result
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.)
Active
Application number
CN201811278355.1A
Other languages
English (en)
Other versions
CN109408389A (zh
Inventor
计卫星
高玉金
王一拙
杨恬
石剑君
石峰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Institute of Technology BIT
Original Assignee
Beijing Institute of Technology BIT
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Institute of Technology BIT filed Critical Beijing Institute of Technology BIT
Priority to CN201811278355.1A priority Critical patent/CN109408389B/zh
Publication of CN109408389A publication Critical patent/CN109408389A/zh
Application granted granted Critical
Publication of CN109408389B publication Critical patent/CN109408389B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Image Analysis (AREA)
  • Image Processing (AREA)
  • Investigating Or Analyzing Materials By The Use Of Magnetic Means (AREA)

Abstract

本发明涉及一种基于深度学习的代码缺陷检测方法及装置,选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;并结合检测工具对被检测代码的检测结果,可以有效判定代码是否真实存在某种缺陷,能够解决现有代码缺陷检测中误报较高的问题,有效提升代码审查的工作效率。

Description

一种基于深度学习的代码缺陷检测方法及装置
技术领域
本发明涉及检测技术领域,特别涉及一种基于深度学习的代码缺陷检测方法及装置。
背景技术
代码缺陷检测应用了代码分析技术,是保证软件质量和可靠性的重要手段。通常将分析方法分为静态分析和动态分析,静态分析方法不需要运行程序,在二进制或源代码层级上对软件的结构,内容进行分析和评价,可以较早地发现程序代码中的缺陷。动态分析方法通过动态分析方法通过运行待测程序以获取和分析程序运行过程中产生的动态信息,以判断其运行时语义性质。在静态分析领域,存在多款开源的静态分析工具,包括FindBugs、JLint和Infer等,也有多款商业化的分析工具,例如Fortify和Coverity等,在实际应用中,这些工具对不同代码缺陷类型的检测能力各不相同,但是难以对其能力进行准确的量化评估,影响了软件评测和审查的工作效率。
深度学习是机器学习中一种基于对数据进行表征学习的方法。它通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。近年来,深度学习技术正逐步应用在软件安全和代码分析领域,利用深度学习技术,可以提取代码的结构特征和语义特征进而利用深度神经网络提取高维特征来描述代码。
针对目前存在着大量代码缺陷检测工具,由于检测技术的限制,这些工具的检测结果通常都包含着大量误报,由于无法得知工具对于特定缺陷的检测能力,面对工具的检测报告,通常难以判定其中哪些为准确结果,这会影响代码的检测和审查的工作效率。
发明内容
鉴于上述问题,本发明提供了一种基于深度学习的代码缺陷检测方法及装置,本发明基于深度学习构建的评估模型,将被检测代码转换为向量表现形式输入评估模型,利用模型输出的置信度,并结合检测工具对被检测代码的检测结果,可以有效判定代码是否真实存在某种缺陷,能够解决现有代码缺陷检测中误报较高的问题,有效提升代码审查的工作效率。
第一方面,本发明实施例提供一种基于深度学习的代码缺陷检测方法,包括:
选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;
将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;
将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;
将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;
当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷。
在一个实施例中,将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果,包括:
将多个所述检测结果和多个所述置信度,输入以下公式,生成预测结果;
Figure GDA0002626063460000021
其中:P表示预测结果,k表示不同代码缺陷检测工具的数量,t表示代码缺陷检测工具(t∈[1,k]),new表示被检测代码,i表示代码缺陷类别,P(t,new,i)表示不同代码缺陷检测工具的置信度,E(t,new,i)表示不同代码缺陷检测工具的检测结果;
当所述代码缺陷检测工具检测的代码new存在缺陷i时,所述E(t,new,i)=1;
当所述代码缺陷检测工具检测的代码new不存在缺陷i时,所述E(t,new,i)=0。
在一个实施例中,所述预设阈值,通过以下方式获得:
所述预设阈值通过对训练集学习而得;所述训练集为:标记是否存在某种缺陷的代码集合。
在一个实施例中,所述预设的转换方法,包括:
图算法、代码向量化算法和代码分析方法。
在一个实施例中,所述评估模型的生成过程,包括:
选择代码缺陷检测工具Tk
获取测试用例C1,C2,...Cj;针对某种代码缺陷Di,获取所述测试用例C1,C2,...Cj的人工标注结果,当测试用例Cj存在缺陷Di时,则标记为L(j,i)=1,否则标记为L(j,i)=0;
使用工具Tk对每个测试用例进行测试,并记录每个测试用例的测试结果;当测试用例Cj存在缺陷Di时,测试结果则记为E(k,j,i)=1,否则记为E(k,j,i)=0;
将工具Tk的测试结果与所述人工标注结果进行对比,针对每种缺陷,当工具Tk测试结果与人工标注结果相同时,即L(j,i)=E(k,j,i),则表示工具测试正确,记为V(k,j,i)=1;否则表示工具测试错误,即L(j,i)!=E(k,j,i),记为V(k,j,i)=-1,将所有对比结果存储在数据库中;
将所述测试用例C1,C2,...Cj转换为对应的特征向量,作为训练数据集;
针对缺陷类型Di,将所述对比结果作为相应数据标签进行训练,生成所述工具Tk对于缺陷Di的检测能力评估模型M(k,i)。
第二方面,本发明实施例提供一种基于深度学习的代码缺陷检测装置,其特征在于,包括:
选取生成模块,用于选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;
转换模块,用于将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;
输入输出模块,用于将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;
生成模块,用于将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;
确定模块,用于当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷。
在一个实施例中,所述生成模块,具体用于将多个所述检测结果和多个所述置信度,输入以下公式,生成预测结果;
Figure GDA0002626063460000041
其中:P表示预测结果,k表示不同代码缺陷检测工具的数量,t表示代码缺陷检测工具(t∈[1,k]),new表示被检测代码,i表示代码缺陷类别,P(t,new,i)表示不同代码缺陷检测工具的置信度,E(t,new,i)表示不同代码缺陷检测工具的检测结果;
当所述代码缺陷检测工具检测的代码new存在缺陷i时,所述E(t,new,i)=1;
当所述代码缺陷检测工具检测的代码new不存在缺陷i时,所述E(t,new,i)=0。
在一个实施例中,所述确定模块中预设阈值,通过以下方式获得:所述预设阈值通过对训练集学习而得;所述训练集为:标记是否存在某种缺陷的代码集合。
在一个实施例中,所述转换模块中预设的转换方法包括:图算法、代码向量化算法和代码分析方法。
在一个实施例中,所述输入输出模块中评估模型的生成过程,包括:
选择代码缺陷检测工具Tk
获取测试用例C1,C2,...Cj;针对某种代码缺陷Di,获取所述测试用例C1,C2,...Cj的人工标注结果,当测试用例Cj存在缺陷Di时,则标记为L(j,i)=1,否则标记为L(j,i)=0;
使用工具Tk对每个测试用例进行测试,并记录每个测试用例的测试结果;当测试用例Cj存在缺陷Di时,测试结果则记为E(k,j,i)=1,否则记为E(k,j,i)=0;
将工具Tk的测试结果与所述人工标注结果进行对比,针对每种缺陷,当工具Tk测试结果与人工标注结果相同时,即L(j,i)=E(k,j,i),则表示工具测试正确,记为V(k,j,i)=1;否则表示工具测试错误,即L(j,i)!=E(k,j,i),记为V(k,j,i)=-1,将所有对比结果存储在数据库中;
将所述测试用例C1,C2,...Cj转换为对应的特征向量,作为训练数据集;
针对缺陷类型Di,将所述对比结果作为相应数据标签进行训练,生成所述工具Tk对于缺陷Di的检测能力评估模型M(k,i)。
本发明实施例提供的上述技术方案的有益效果至少包括:
本发明实施例提供的一种基于深度学习的代码缺陷检测方法,选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷。本发明基于深度学习构建的评估模型,将被检测代码转换为向量表现形式输入评估模型,利用模型输出的置信度,并结合检测工具对被检测代码的检测结果,可以有效判定代码是否真实存在某种缺陷,能够解决现有代码缺陷检测中误报较高的问题,有效提升代码审查的工作效率。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
图1为本发明实施例提供的基于深度学习的代码缺陷检测方法流程图;
图2为本发明实施例提供的提取出代码的控制流图;
图3为本发明实施例提供的评估模型结构示意图;
图4为本发明实施例提供的基于深度学习的代码缺陷检测方法的工作流程图;
图5为本发明实施例提供的基于深度学习的代码缺陷检测装置的框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
参照图1所示,本发明实施例提供的基于深度学习的代码缺陷检测方法,包括:S11~S15;
S11、选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;
S12、将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;
S13、将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;
S14、将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;
S15、当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷。
其中,步骤S11中,多个代码缺陷检测工具,例如开源的FindBugs、JLint和Infer等,也可以是商业化的分析工具,例如Fortify和Coverity等;多个代码缺陷检测工具可以用T1,T2,...,Tk,表示。可以检测针对多种代码缺陷,比如资源泄漏、SQL注入、XSS、缓冲区溢出、文件上传等多种软件缺陷,可命名为D1,D2,...,Di等,其中每个检测工具都有针对不同的软件缺陷表现出不同的检测能力和适用性,比如FindBugs是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。本发明实施例对代码缺陷检测工具的种类和数量不做限定。本步骤S11中,工具Tk针对Di,对被检测代码进行检测,生成的多个工具的检测结果,将上述多个检测结果放在一起构成一个集合。
步骤S12中,将被检测代码通过转换方法,转换为被检测代码的特征向量,该特征向量包括被检测代码的结构特征和语义特征。上述转换方法可以是各种图算法,代码向量化算法和其他代码分析方法。
图算法是指利用概率图模型如马尔可夫随机场,平均场等建模方法将代码控制流图压缩为可以用来分类的多维向量,本发明中将重点讲解此类方法。除此此外,代码可以看成是一种特殊的文本,在自然语言处理领域中具有很多成熟的算法将文本转换为向量,如Doc2vec,WordRank,FastText等算法,运用这些算法可以抽取代码文本上的特征并将其转换为向量。自然语言处理的方法忽略了代码结构上的信息,因此还可以采取其他向量化的算法提取代码的结构特征,如自编码神经网络可以将代码语法树进行自编码从而得到代码结构的特征向量,将其与自然语言处理算法得到的代码文本特征相结合,可以抽取出代码更完整的特征。以上便是一些代码向量化的方法,都适用于本发明提出的缺陷检测方法。
比如,对一份代码,首先提取出代码的控制流图,如图2中左半部分所示,以流程图的每个代码块为单位,提取代码块里的基本信息,如调用函数的次数,跳转指令次数,字符串以及数值常量数等。至此就得到了一个带有代码基本信息的控制流程图ACFG(如图2中的右半部分)。当然图2中右半部分的流程图并不能直接运用到算法中,但需要将它压缩为一个多维的向量以方便后续的分类和学习。
比如使用了一种以神经网络来压缩ACFG的算法,以马尔可夫随机场建模为例,用平均场法求解的方法,既考虑了控制流图上单个节点的信息,又考虑了各个节点之间的连接信息。此处神经网络拟合的函数包括:
Figure GDA0002626063460000081
可以得到每个节点的隐变量的公式,然后对各个节点的隐变量进行求和激活得到最终的控制流图特征向量:
Figure GDA0002626063460000082
参照图3所示,简单的说,这个模型给每个代码块节点(图中以x表示)都赋予了一个隐变量(图中以μ表示),每个隐变量之间相互联系,联系的方式与控制流图中代码块的连接方式相同,如图3中的x1,x2指向x3,那么在隐变量中,μ12也相应的指向μ3。以ACFG上原有的信息为迭代初始值,迭代更新μ的值,并且更新时μ的值受他相邻节点值的影响,如μ3每一次更新都会受u1,μ2上次迭代值的影响,这样反复迭代过程中,就能够将ACFG的节点信息和节点间的连接信息进行压缩,并且保证了信息的损失最小,最后得到每个节点的隐变量,对它们进行求和就得到了最终压缩的ACFG向量,这是一个多维的向量,然后可以用各种机器学习算法进行分类。
步骤S13中,将被检测代码的特征向量分别输入多个代码缺陷检测工具相对应的评估模型,该模型可以预测得到工具Tk对于缺陷Di在被检测代码上检测结果的置信度。
步骤S14~S15中,将步骤S11的多个检测结果和步骤S13的多个置信度进行加权求和生成预测结果,再将预测结果与预设阈值比较,当大于该预设阈值时,确定被检测代码存在缺陷。
本实施例中,将被检测代码转换为向量表现形式输入评估模型,利用模型输出的置信度,并结合检测工具对被检测代码的检测结果,可以有效判定代码是否真实存在某种缺陷,能够解决现有代码缺陷检测中误报较高的问题,有效提升代码审查的工作效率。
在一个实施例中,上述步骤S13中的评估模型可以通过以下步骤生成:
S131、选择代码缺陷检测工具Tk
S132、获取测试用例C1,C2,...Cj;针对某种代码缺陷Di,获取所述测试用例C1,C2,...Cj的人工标注结果,当测试用例Cj存在缺陷Di时,则标记为L(j,i)=1,否则标记为L(j,i)=0;
S133、使用工具Tk对每个测试用例进行测试,并记录每个测试用例的测试结果;当测试用例Cj存在缺陷Di时,测试结果则记为E(k,j,i)=1,否则记为E(k,j,i)=0;
S134、将工具Tk的测试结果与所述人工标注结果进行对比,针对每种缺陷,当工具Tk测试结果与人工标注结果相同时,即L(j,i)=E(k,j,i),则表示工具测试正确,记为V(k,j,i)=1;否则表示工具测试错误,即L(j,i)!=E(k,j,i),记为V(k,j,i)=-1,将所有对比结果存储在数据库中;
S135、将所述测试用例C1,C2,...Cj转换为对应的特征向量,作为训练数据集;
S136、针对缺陷类型Di,将所述对比结果作为相应数据标签进行训练,生成所述工具Tk对于缺陷Di的检测能力评估模型M(k,i)。
本实施例中,分别使用多个代码缺陷工具对测试集中的每一个测试用例进行测试,其中,该测试用例可以从实际的代码中选择或者人工编写一定数量的测试程序比如命名为C1,C2,...,Cj等,这些测试用例可能有缺陷D1,D2,...,Di,也可能没有缺陷;上述测试集也可以根据实际情况不断更新或补充新的测试用例,或补充具有新的缺陷(包括现有缺陷和潜在的未知缺陷)的测试用例,以增加该检测方法的准确性。
分别使用每种工具对每个测试用例进行测试,并记录每个测试用例的测试结果,如果工具Tk针对某个测试用例Cj关于缺陷Di的测试结果为阳性,即存在缺陷时,则记为E(k,j,i)=1;否则记为E(k,j,i)=0;
对所有的测试用例进行人工标注,具体方法为,当测试用例Cj存在某种缺陷Di时,则标记为L(j,i)=1,否则标记为L(j,i)=0;
将工具测试结果与人工标注结果进行对比,具体做法为:针对每种缺陷,将工具测试结果与人工标注结果进行对比,如果工具测试结果与人工标注结果相同,即E(k,j,i)=L(j,i),则表示工具测试正确,记为V(k,j,i)=1,否则表示工具测试错误,即E(k,j,i)≠L(j,i),记为V(k,j,i)=-1,将所有对比结果存储在数据库中。每个测试用例需要人工给一个标准结果,例如是否存在空指针引用的问题,然后用工具检测,据此判断工具检测的是否正确。
参照图3所示,该模型用于预测某种缺陷检测工具对某段代码的检测结果是否正确,其本质上是一个分类模型,即将代码分为该工具能正确检测的代码和该工具不能检测的代码两类,当模型训练成功后,对一段新的代码,该模型能够给出该代码属于每一类的概率,从而能够得到缺陷检测工具检测该段代码检测结果的置信度。
其中,判断模型是否训练成功可以从两个方面考虑。首先从模型训练过程来说,模型训练时有训练集和验证集,在训练时当模型的设计不存在问题时,残差将会收敛,训练集和验证集上的准确率也将收敛到一定的范围,按照训练的实际情况可以在模型收敛后停止训练,这样就得到了训练完成的模型。同时可以选取不同的训练集和验证集,训练多个模型,选取其中效果最好的(ROC或者AUC最好)的模型,这样代表模型训练的初步成功。然后从模型效果来说,可以对模型的实际效果定一个目标,如提高实际的缺陷准确率10%左右,如果训练好的模型可以实现这一目标,模型训练成功;否则调整模型设计,重新训练,直到完成设定的目标。
参照图3所示,该评估模型以一个代码的带节点信息的控制流图为输入,以预测的分类结果为输出。它由两个深度神经网络连接而成。首先用一个神经网络负责对代码控制流图进行压缩,将复杂的代码信息压缩到一个多维向量中,用于后续网络的分类。另一个神经网络为一个分类神经网络,用于对上一个神经网络的结果进行分类,输出测试代码能否被该工具正确检测的概率。
图压缩神经网络可以采用各种图压缩算法,这里采用了马尔可夫随机场建模,并且用平均场法求解的方法,既考虑了控制流图上单个节点的信息,又考虑了各个节点之间的连接信息。此处神经网络拟合的函数包括:
Figure GDA0002626063460000111
其中,W1,W2表示权重矩阵,μ表示隐变量,x表示显性变量,t表示迭代的次数,i表示对应的节点标号,j表示i节点对应的相邻节点中的某个节点标号,σ表示激活函数。
公式(1)代表一次迭代过程,μ代表隐变量,它的值与显性变量x和相邻的接邻隐变量的值有关,然而并不能直接得到这个关系,因此,需要用W1和W2两个权重矩阵来拟合这种相关关系,得到的是一种线性的函数,线性函数的表示范围是有限的,因此,在函数外围加了一个激活函数,将这种关系非线性化,就得到了μ和x以及相邻节点的表示函数。
通过公式(1)可以得到每个节点的隐变量的公式,然后对各个节点的隐变量进行求和激活得到最终的控制流图特征向量:
Figure GDA0002626063460000121
上式中,
Figure GDA0002626063460000122
表示一个多维向量,g是控制流图ACFG的一个抽象表示,V表示控制流图中节点集合,v表示其中的某个节点,μv表示v节点对应的隐变量,T表示矩阵转置,
Figure GDA0002626063460000123
为函数名称,代表控制流图g到一个多维向量的映射。
公式(2)代表对隐变量的值进行求和非线性化的过程;
分类网络对图特征向量进行分类,用一个简单的多层神经网络即可实现。为了避免过拟合,参照图3所示,采用了较少层数的三层神经网络,并且对每一层都进行了dropout操作。
此分类网络拟合的函数公式为:
P(φ(g))=W4*(relu(W3*relu(φ(g)))) (3)
上式中,P表示最终的预测结果,W3,W4表示权重矩阵,relu表示激活函数,
Figure GDA0002626063460000124
表示一个多维向量。
每一层对g乘以一个权重(W3,W4)并使用relu函数进行激活,这是一个常用的分类模型,对应如图3中神经网络模型的右部分。
模型训练时以训练代码的带节点信息的控制流图为输入,工具检测该代码正确与否的结果作为训练的标签。训练运用了AdaGrad的迭代方法更新权值,损失函数使用了交叉熵的函数。
在一个实施例中,步骤S14,将多个检测结果和所述置信度,进行加权求和生成预测结果,包括:
将多个检测结果和多个所述置信度,输入以下公式,生成预测结果;
Figure GDA0002626063460000131
其中:P表示预测结果,k表示不同代码缺陷检测工具的数量,t表示代码缺陷检测工具(t∈[1,k]),new表示被检测代码,i表示代码缺陷类别,P(t,new,i)表示不同代码缺陷检测工具的置信度,E(t,new,i)表示不同代码缺陷检测工具的检测结果;当代码缺陷检测工具检测的代码new存在缺陷i时,E(t,new,i)=1;当代码缺陷检测工具检测的代码new不存在缺陷i时,所述E(t,new,i)=0
参照图4所示,详细说明下本发明提供的基于深度学习的代码缺陷检测方法;
第1步:选择多个可用的代码缺陷检测工具T1,T2,...,Tk,可以是开源的,也可以是商业工具;
第2步:针对多种代码缺陷D1,D2,...,Di,从实际的代码中选择或者人工编写一定数量的测试程序C1,C2,...,Cj,这些测试用例可能有缺陷,也可能没有缺陷;
第3步:对所有的测试用例进行人工标注,具体方法为,当测试用例CJ存在某种缺陷Di时,则标记为L(j,i)=1,否则标记为L(j,i)=0;
第4步:分别使用每种工具对每个测试程序进行测试,并记录每个测试用例的测试结果,如果工具Tk针对某个测试用例Cj关于缺陷Di的测试结果为阳性,则记为E(k,j,i)=1,否则记为E(k,j,i)=0;
第5步:将工具测试结果与人工标注结果进行对比,具体做法为:针对每种缺陷,将工具测试结果与人工标注结果进行对比,如果人工标注结果与工具测试结果相同,即L(j,i)=E(k,j,i),则表示工具测试正确,记为V(k,j,i)=1,否则表示工具测试错误,即L(j,i)≠E(k,j,i),记为V(k,j,i)=-1,将所有对比结果存储在数据库中;
第6步:将第3步得到的测试用例转换为对应的向量表示形式,作为训练数据集,该向量可以体现代码的结构特征和语义特征;
第7步,针对缺陷类型Di,将第5步的对比结果即工具能否正确检测Di作为相应数据标签进行训练,得到该工具对于缺陷Di的检测能力评估模型M(k,i),该模型可以预测得到工具对于缺陷Di在目标代码Cj上检测结果的置信度P(k,j,i)。
第8步,对于新的被测代码Cnew,利用第6步中使用的转换方法生成Cnew的向量表示形式作为评估模型M(k,i)的输入,得到工具Tk在Cnew中检测Di类型缺陷结果的置信度P(k,new,i),该置信度反映了工具Tk对于缺陷Di在程序Cnew中的检测能力。
第9步,根据工具实际的检测结果,利用模型输出的置信度可以有效判定代码是否真实存在某种缺陷,方法如下:
用户可以根据不同工具和不同缺陷训练得到多个检测能力评估模型,利用目标被测代码Cnew,对于特定缺陷Di,可以使用不同工具相应的检测能力评估模型进行评估,从而得到不同的工具检测结果的置信度P(t,new,i)(t∈[1,k]),利用k个工具对Cnew中的Di类型缺陷进行检测,得到实际检测结果E(t,new,i)(t∈[1,k])。最终可以得到Cnew中存在Di类型缺陷的可能性大小:
Figure GDA0002626063460000141
对P的大小设定一个阈值m则可以判定Cnew中是否真实存在Di类型缺陷。
根据上述实施例可知,P(t,new,i)在0和1之间,E(t,new,i)等于0或1,在公式(4)中,那么对最后的P值来说,P应该介于0-K之间;并且,当P越大时,Cnew越有可能存在缺陷,那么肯定存在一个阈值m;
当P<m,判定代码不存在Di缺陷;当P>m,判定代码存在Di缺陷。为了提高最终结果的准确性,m的取值可以通过对训练集进行学习得到。根据0<m<k,选定0为初值,选取一个步长(比如0.01),不停改变m的值,直到m=k,并且对每个m的值,带入数据集就能得到m在这个数据集上对应的准确率,选定在训练集上预测准确率最高的m值作为最终的m值。其中训练集是指标记了是否存在缺陷Di的代码集合,该代码集合数量足够多,且具有代表性,代码的各种类型比例相当;比如包括一半数量为存在缺陷Di的代码,另一半数量为不存在缺陷Di的代码;比如复杂度较高的代码数量和简单代码数量相当。
换句话说,m的值可以通过对训练集学习而得到,是指对一个训练集,可以通过不停的迭代改变m来得到一个最佳的m值。对每个m值,都能得到这个m值下代码缺陷判定正确的准确率,以这个准确率为指标,从m能取的最小值到最大值进行迭代,然后选取可以使准确率最高的m值。当然这里的m值只是代表对这个训练集的效果最好,但是只要训练集数量足够且具有代表性,此处m的选值不失与为一种最佳的选择。
基于同一发明构思,本发明实施例还提供了一种基于深度学习的代码缺陷检测装置,由于该装置所解决问题的原理与前述基于深度学习的代码缺陷检测方法相似,因此该装置的实施可以参见前述方法的实施,重复之处不再赘述。
本发明实施例还提供了一种基于深度学习的代码缺陷检测装置,该装置参照图5所示,包括:
选取生成模块51,用于选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;
转换模块52,用于将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;
输入输出模块53,用于将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;
生成模块54,用于将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;
确定模块55,用于当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷。
在一个实施例中,所述生成模块54,具体用于将多个所述检测结果和多个所述置信度,输入以下公式,生成预测结果;
Figure GDA0002626063460000161
其中:P表示预测结果,k表示不同代码缺陷检测工具的数量,t表示代码缺陷检测工具(t∈[1,k]),new表示被检测代码,i表示代码缺陷类别,P(t,new,i)表示不同代码缺陷检测工具的置信度,E(t,new,i)表示不同代码缺陷检测工具的检测结果;
当所述代码缺陷检测工具检测的代码new存在缺陷i时,所述E(t,new,i)=1;
当所述代码缺陷检测工具检测的代码new不存在缺陷i时,所述E(t,new,i)=0。
在一个实施例中,所述确定模块55中预设阈值,通过以下方式获得:所述预设阈值通过对训练集学习而得;所述训练集为:标记是否存在某种缺陷的代码集合。
在一个实施例中,所述转换模块52中预设的转换方法包括:图算法、代码向量化算法和代码分析方法。
在一个实施例中,所述输入输出模块53中评估模型的生成过程,包括:
选择代码缺陷检测工具Tk
获取测试用例C1,C2,...Cj;针对某种代码缺陷Di,获取所述测试用例C1,C2,...Cj的人工标注结果,当测试用例Cj存在缺陷Di时,则标记为L(j,i)=1,否则标记为L(j,i)=0;
使用工具Tk对每个测试用例进行测试,并记录每个测试用例的测试结果;当测试用例Ci存在缺陷Di时,测试结果则记为E(k,j,i)=1,否则记为E(k,j,i)=0;
将工具Tk的测试结果与所述人工标注结果进行对比,针对每种缺陷,当工具Tk测试结果与人工标注结果相同时,即L(j,i)=E(k,j,i),则表示工具测试正确,记为V(k,j,i)=1;否则表示工具测试错误,即L(j,i)!=E(k,j,i),记为V(k,j,i)=-1,将所有对比结果存储在数据库中;
将所述测试用例C1,C2,…Cj转换为对应的特征向量,作为训练数据集;
针对缺陷类型Di,将所述对比结果作为相应数据标签进行训练,生成所述工具Tk对于缺陷Di的检测能力评估模型M(k,i)。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (8)

1.一种基于深度学习的代码缺陷检测方法,其特征在于,包括:
选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;
将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;
将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;
将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;
当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷;所述评估模型的生成过程,包括:
选择代码缺陷检测工具Tk
获取测试用例C1,C2,…Cj;针对某种代码缺陷Di,获取所述测试用例C1,C2,…Cj的人工标注结果,当测试用例Cj存在缺陷Di时,则标记为L(j,i)=1,否则标记为L(j,i)=0;
使用工具Tk对每个测试用例进行测试,并记录每个测试用例的测试结果;当测试用例Cj存在缺陷Di时,测试结果则记为E(k,j,i)=1,否则记为E(k,j,i)=0;
将工具Tk的测试结果与所述人工标注结果进行对比,针对每种缺陷,当工具Tk测试结果与人工标注结果相同时,即L(j,i)=E(k,j,i),则表示工具测试正确,记为V(k,j,i)=1;否则表示工具测试错误,即L(j,i)!=E(k,j,i),记为V(k,j,i)=-1,将所有对比结果存储在数据库中;
将所述测试用例C1,C2,…Cj转换为对应的特征向量,作为训练数据集;
针对缺陷类型Di,将所述对比结果作为相应数据标签进行训练,生成所述工具Tk对于缺陷Di的检测能力评估模型M(k,i)。
2.如权利要求1所述的方法,其特征在于,将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果,包括:
将多个所述检测结果和多个所述置信度,输入以下公式,生成预测结果;
Figure FDA0002626063450000021
其中:P表示预测结果,k表示不同代码缺陷检测工具的数量,t表示代码缺陷检测工具(t∈[1,k]),new表示被检测代码,i表示代码缺陷类别,P(t,new,i)表示不同代码缺陷检测工具的置信度,E(t,new,i)表示不同代码缺陷检测工具的检测结果;
当所述代码缺陷检测工具检测的代码new存在缺陷i时,所述E(t,new,i)=1;
当所述代码缺陷检测工具检测的代码new不存在缺陷i时,所述E(t,new,i)=0。
3.如权利要求1所述的方法,其特征在于,所述预设阈值,通过以下方式获得:
所述预设阈值通过对训练集学习而得;所述训练集为:标记是否存在某种缺陷的代码集合。
4.如权利要求1所述的方法,其特征在于,所述预设的转换方法,包括:图算法、代码向量化算法和代码分析方法。
5.一种基于深度学习的代码缺陷检测装置,其特征在于,包括:
选取生成模块,用于选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;
转换模块,用于将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;
输入输出模块,用于将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;
生成模块,用于将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;
确定模块,用于当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷;
所述输入输出模块中评估模型的生成过程,包括:
选择代码缺陷检测工具Tk
获取测试用例C1,C2,…Cj;针对某种代码缺陷Di,获取所述测试用例C1,C2,…Cj的人工标注结果,当测试用例Cj存在缺陷Di时,则标记为L(j,i)=1,否则标记为L(j,i)=0;
使用工具Tk对每个测试用例进行测试,并记录每个测试用例的测试结果;当测试用例Cj存在缺陷Di时,测试结果则记为E(k,j,i)=1,否则记为E(k,j,i)=0;
将工具Tk的测试结果与所述人工标注结果进行对比,针对每种缺陷,当工具Tk测试结果与人工标注结果相同时,即L(j,i)=E(k,j,i),则表示工具测试正确,记为V(k,j,i)=1;否则表示工具测试错误,即L(j,i)!=E(k,j,i),记为V(k,j,i)=-1,将所有对比结果存储在数据库中;
将所述测试用例C1,C2,…Cj转换为对应的特征向量,作为训练数据集;
针对缺陷类型Di,将所述对比结果作为相应数据标签进行训练,生成所述工具Tk对于缺陷Di的检测能力评估模型M(k,i)。
6.如权利要求5所述的装置,其特征在于,所述生成模块,具体用于将多个所述检测结果和多个所述置信度,输入以下公式,生成预测结果;
Figure FDA0002626063450000031
其中:P表示预测结果,k表示不同代码缺陷检测工具的数量,t表示代码缺陷检测工具(t∈[1,k]),new表示被检测代码,i表示代码缺陷类别,P(t,new,i)表示不同代码缺陷检测工具的置信度,E(t,new,i)表示不同代码缺陷检测工具的检测结果;
当所述代码缺陷检测工具检测的代码new存在缺陷i时,所述E(t,new,i)=1;
当所述代码缺陷检测工具检测的代码new不存在缺陷i时,所述E(t,new,i)=0。
7.如权利要求5所述的装置,其特征在于,所述确定模块中预设阈值,通过以下方式获得:
所述预设阈值通过对训练集学习而得;所述训练集为:标记是否存在某种缺陷的代码集合。
8.如权利要求5所述的装置,其特征在于,所述转换模块中预设的转换方法包括:图算法、代码向量化算法和代码分析方法。
CN201811278355.1A 2018-10-30 2018-10-30 一种基于深度学习的代码缺陷检测方法及装置 Active CN109408389B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811278355.1A CN109408389B (zh) 2018-10-30 2018-10-30 一种基于深度学习的代码缺陷检测方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811278355.1A CN109408389B (zh) 2018-10-30 2018-10-30 一种基于深度学习的代码缺陷检测方法及装置

Publications (2)

Publication Number Publication Date
CN109408389A CN109408389A (zh) 2019-03-01
CN109408389B true CN109408389B (zh) 2020-10-16

Family

ID=65470265

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811278355.1A Active CN109408389B (zh) 2018-10-30 2018-10-30 一种基于深度学习的代码缺陷检测方法及装置

Country Status (1)

Country Link
CN (1) CN109408389B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2022128469A1 (en) * 2020-12-15 2022-06-23 International Business Machines Corporation System testing infrastructure with hidden variable, hidden attribute, and hidden value detection

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113490920A (zh) 2019-03-26 2021-10-08 西门子股份公司 一种评估代码设计质量的方法、装置和系统
CN110147235B (zh) * 2019-03-29 2021-01-01 中国科学院信息工程研究所 一种源代码与二进制代码间的语义比对方法和装置
CN110135157B (zh) * 2019-04-04 2021-04-09 国家计算机网络与信息安全管理中心 恶意软件同源性分析方法、系统、电子设备及存储介质
CN110162963B (zh) * 2019-04-26 2021-07-06 佛山市微风科技有限公司 一种识别过权应用程序的方法
CN110297656B (zh) * 2019-05-23 2024-01-26 天航长鹰(江苏)科技有限公司 基于配置模型评审代码的方法、装置及计算机设备
CN110310260B (zh) * 2019-06-19 2021-10-15 北京百度网讯科技有限公司 基于机器学习模型的分料决策方法、设备和存储介质
CN110427317A (zh) * 2019-07-05 2019-11-08 深圳壹账通智能科技有限公司 一种相关值确定方法及装置
CN110413319B (zh) * 2019-08-01 2020-10-09 北京理工大学 一种基于深度语义的代码函数味道检测方法
CN110597735B (zh) * 2019-09-25 2021-03-05 北京航空航天大学 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法
CN110825642B (zh) * 2019-11-11 2021-01-01 浙江大学 一种基于深度学习的软件代码行级缺陷检测方法
CN112131122B (zh) * 2020-09-27 2022-09-30 北京智联安行科技有限公司 一种源代码缺陷检测工具误报评估方法及装置
CN112269568A (zh) * 2020-11-16 2021-01-26 加和(北京)信息科技有限公司 一种基于nlp算法的预警处理方法及系统
CN112416782A (zh) * 2020-11-25 2021-02-26 上海信联信息发展股份有限公司 测试结果的验证方法、装置和电子设备
CN112948261A (zh) * 2021-03-29 2021-06-11 建信金融科技有限责任公司 针对代码检测结果的审计方法和装置
CN113434548B (zh) * 2021-06-25 2022-06-17 北京理工大学 一种基于Spark的大规模数据流分析方法及系统
CN116433623A (zh) * 2023-03-31 2023-07-14 杭州数创自动化控制技术有限公司 一种缺陷位置的标记及识别方法、系统、设备和介质
CN116662206B (zh) * 2023-07-24 2024-02-13 泰山学院 计算机软件在线实时可视化调试方法及装置

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103092762A (zh) * 2013-02-19 2013-05-08 南京大学 一种适用于快速软件开发模式的实时软件缺陷检测方法
CN103713998A (zh) * 2013-11-07 2014-04-09 北京安码科技有限公司 一种可扩展的在线静态代码缺陷分析方法
CN103984623A (zh) * 2014-04-28 2014-08-13 天津大学 一种基于缺陷检测的软件安全风险评估方法
CN107885999A (zh) * 2017-11-08 2018-04-06 华中科技大学 一种基于深度学习的漏洞检测方法及系统
CN108009080A (zh) * 2016-10-28 2018-05-08 腾讯科技(深圳)有限公司 一种代码扫描工具的评估方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20170212829A1 (en) * 2016-01-21 2017-07-27 American Software Safety Reliability Company Deep Learning Source Code Analyzer and Repairer

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103092762A (zh) * 2013-02-19 2013-05-08 南京大学 一种适用于快速软件开发模式的实时软件缺陷检测方法
CN103713998A (zh) * 2013-11-07 2014-04-09 北京安码科技有限公司 一种可扩展的在线静态代码缺陷分析方法
CN103984623A (zh) * 2014-04-28 2014-08-13 天津大学 一种基于缺陷检测的软件安全风险评估方法
CN108009080A (zh) * 2016-10-28 2018-05-08 腾讯科技(深圳)有限公司 一种代码扫描工具的评估方法及装置
CN107885999A (zh) * 2017-11-08 2018-04-06 华中科技大学 一种基于深度学习的漏洞检测方法及系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于静态检测的代码审计技术研究;罗琴灵;《中国优秀硕士学位论文全文数据库信息科技辑》;20160315;第I138-385页 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2022128469A1 (en) * 2020-12-15 2022-06-23 International Business Machines Corporation System testing infrastructure with hidden variable, hidden attribute, and hidden value detection

Also Published As

Publication number Publication date
CN109408389A (zh) 2019-03-01

Similar Documents

Publication Publication Date Title
CN109408389B (zh) 一种基于深度学习的代码缺陷检测方法及装置
CN111967502B (zh) 一种基于条件变分自编码器的网络入侵检测方法
CN110232280B (zh) 一种基于树结构卷积神经网络的软件安全漏洞检测方法
CN112491796B (zh) 一种基于卷积神经网络的入侵检测及语义决策树量化解释方法
CN111600919B (zh) 智能网络应用防护系统模型的构建方法和装置
CN108710576B (zh) 基于异构迁移的数据集扩充方法及软件缺陷预测方法
CN112966714A (zh) 一种边缘时序数据异常检测和网络可编程控制方法
CN112989358A (zh) 提高基于深度学习的源代码漏洞检测健壮性的方法及装置
CN113723070B (zh) 文本相似度模型训练方法、文本相似度检测方法及装置
CN116453438A (zh) 一种显示屏参数检测方法、装置、设备及存储介质
CN115577357A (zh) 一种基于堆叠集成技术的Android恶意软件检测方法
CN116150757A (zh) 一种基于cnn-lstm多分类模型的智能合约未知漏洞检测方法
CN115277189A (zh) 基于生成式对抗网络的无监督式入侵流量检测识别方法
CN115168865A (zh) 基于领域自适应的跨项目漏洞检测模型
WO2020255414A1 (ja) 学習支援装置、学習支援方法、及びコンピュータ読み取り可能な記録媒体
CN113822336A (zh) 一种云硬盘故障预测方法、装置、系统及可读存储介质
CN116597635B (zh) 无线通讯智能燃气表控制器及其控制方法
CN117574383A (zh) 一种基于特征融合和代码可视化技术的软件漏洞检测模型的方法
CN115017015B (zh) 一种边缘计算环境下程序异常行为检测方法及系统
CN111858343A (zh) 一种基于攻击能力的对抗样本生成方法
Simao et al. A technique to reduce the test case suites for regression testing based on a self-organizing neural network architecture
CN116361191A (zh) 一种基于人工智能的软件兼容性处理方法
CN116502705A (zh) 兼用域内外数据集的知识蒸馏方法和计算机设备
CN116361788A (zh) 一种基于机器学习的二进制软件漏洞预测方法
Hao et al. New fusion features convolutional neural network with high generalization ability on rolling bearing fault diagnosis

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