本发明涉及检测技术领域,特别涉及一种基于深度学习的代码缺陷检测方法及装置。
背景技术:
代码缺陷检测应用了代码分析技术,是保证软件质量和可靠性的重要手段。通常将分析方法分为静态分析和动态分析,静态分析方法不需要运行程序,在二进制或源代码层级上对软件的结构,内容进行分析和评价,可以较早地发现程序代码中的缺陷。动态分析方法通过动态分析方法通过运行待测程序以获取和分析程序运行过程中产生的动态信息,以判断其运行时语义性质。在静态分析领域,存在多款开源的静态分析工具,包括findbugs、jlint和infer等,也有多款商业化的分析工具,例如fortify和coverity等,在实际应用中,这些工具对不同代码缺陷类型的检测能力各不相同,但是难以对其能力进行准确的量化评估,影响了软件评测和审查的工作效率。
深度学习是机器学习中一种基于对数据进行表征学习的方法。它通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。近年来,深度学习技术正逐步应用在软件安全和代码分析领域,利用深度学习技术,可以提取代码的结构特征和语义特征进而利用深度神经网络提取高维特征来描述代码。
针对目前存在着大量代码缺陷检测工具,由于检测技术的限制,这些工具的检测结果通常都包含着大量误报,由于无法得知工具对于特定缺陷的检测能力,面对工具的检测报告,通常难以判定其中哪些为准确结果,这会影响代码的检测和审查的工作效率。
技术实现要素:
鉴于上述问题,本发明提供了一种基于深度学习的代码缺陷检测方法及装置,本发明基于深度学习构建的评估模型,将被检测代码转换为向量表现形式输入评估模型,利用模型输出的置信度,并结合检测工具对被检测代码的检测结果,可以有效判定代码是否真实存在某种缺陷,能够解决现有代码缺陷检测中误报较高的问题,有效提升代码审查的工作效率。
第一方面,本发明实施例提供一种基于深度学习的代码缺陷检测方法,包括:
选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;
将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;
将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;
将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;
当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷。
在一个实施例中,将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果,包括:
将多个所述检测结果和多个所述置信度,输入以下公式,生成预测结果;
其中: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)=-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)。
第二方面,本发明实施例提供一种基于深度学习的代码缺陷检测装置,其特征在于,包括:
选取生成模块,用于选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;
转换模块,用于将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;
输入输出模块,用于将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;
生成模块,用于将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;
确定模块,用于当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷。
在一个实施例中,所述生成模块,具体用于将多个所述检测结果和多个所述置信度,输入以下公式,生成预测结果;
其中: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)=-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)。
本发明实施例提供的上述技术方案的有益效果至少包括:
本发明实施例提供的一种基于深度学习的代码缺陷检测方法,选取多个代码缺陷检测工具,分别对被检测代码进行检测,相应生成多个检测结果;将所述被检测代码通过预设的转换方法,转换为所述被检测代码的特征向量;所述特征向量包括所述被检测代码的结构特征和语义特征;将所述特征向量分别输入多个所述代码缺陷检测工具各自相对应的评估模型,输出多个所述代码缺陷检测工具分别对所述被检测代码检测缺陷结果的置信度;将多个所述检测结果和多个所述置信度,进行加权求和生成预测结果;当所述预测结果大于预设阈值时,确定所述被检测代码存在缺陷。本发明基于深度学习构建的评估模型,将被检测代码转换为向量表现形式输入评估模型,利用模型输出的置信度,并结合检测工具对被检测代码的检测结果,可以有效判定代码是否真实存在某种缺陷,能够解决现有代码缺陷检测中误报较高的问题,有效提升代码审查的工作效率。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
图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的算法,以马尔可夫随机场建模为例,用平均场法求解的方法,既考虑了控制流图上单个节点的信息,又考虑了各个节点之间的连接信息。此处神经网络拟合的函数包括:
可以得到每个节点的隐变量的公式,然后对各个节点的隐变量进行求和激活得到最终的控制流图特征向量:
参照图3所示,简单的说,这个模型给每个代码块节点(图中以x表示)都赋予了一个隐变量(图中以μ表示),每个隐变量之间相互联系,联系的方式与控制流图中代码块的连接方式相同,如图3中的x1,x2指向x3,那么在隐变量中,μ1,μ2也相应的指向μ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所示,该评估模型以一个代码的带节点信息的控制流图为输入,以预测的分类结果为输出。它由两个深度神经网络连接而成。首先用一个神经网络负责对代码控制流图进行压缩,将复杂的代码信息压缩到一个多维向量中,用于后续网络的分类。另一个神经网络为一个分类神经网络,用于对上一个神经网络的结果进行分类,输出测试代码能否被该工具正确检测的概率。
图压缩神经网络可以采用各种图压缩算法,这里采用了马尔可夫随机场建模,并且用平均场法求解的方法,既考虑了控制流图上单个节点的信息,又考虑了各个节点之间的连接信息。此处神经网络拟合的函数包括:
其中,w1,w2表示权重矩阵,μ表示隐变量,x表示显性变量,t表示迭代的次数,i表示对应的节点标号,j表示i节点对应的相邻节点中的某个节点标号,σ表示激活函数。
公式(1)代表一次迭代过程,μ代表隐变量,它的值与显性变量x和相邻的接邻隐变量的值有关,然而并不能直接得到这个关系,因此,需要用w1和w2两个权重矩阵来拟合这种相关关系,得到的是一种线性的函数,线性函数的表示范围是有限的,因此,在函数外围加了一个激活函数,将这种关系非线性化,就得到了μ和x以及相邻节点的表示函数。
通过公式(1)可以得到每个节点的隐变量的公式,然后对各个节点的隐变量进行求和激活得到最终的控制流图特征向量:
上式中,
公式(2)代表对隐变量的值进行求和非线性化的过程;
分类网络对图特征向量进行分类,用一个简单的多层神经网络即可实现。为了避免过拟合,参照图3所示,采用了较少层数的三层神经网络,并且对每一层都进行了dropout操作。
此分类网络拟合的函数公式为:
上式中,p表示最终的预测结果,w3,w4表示权重矩阵,relu表示激活函数,
每一层对g乘以一个权重(w3,w4)并使用relu函数进行激活,这是一个常用的分类模型,对应如图3中神经网络模型的右部分。
模型训练时以训练代码的带节点信息的控制流图为输入,工具检测该代码正确与否的结果作为训练的标签。训练运用了adagrad的迭代方法更新权值,损失函数使用了交叉熵的函数。
在一个实施例中,步骤s14,将多个检测结果和所述置信度,进行加权求和生成预测结果,包括:
将多个检测结果和多个所述置信度,输入以下公式,生成预测结果;
其中: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)=-1。
参照图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类型缺陷的可能性大小:
对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,具体用于将多个所述检测结果和多个所述置信度,输入以下公式,生成预测结果;
其中: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)=-1。
在一个实施例中,所述确定模块55中预设阈值,通过以下方式获得:所述预设阈值通过对训练集学习而得;所述训练集为:标记是否存在某种缺陷的代码集合。
在一个实施例中,所述转换模块52中预设的转换方法包括:图算法、代码向量化算法和代码分析方法。
在一个实施例中,所述输入输出模块53中评估模型的生成过程,包括:
选择代码缺陷检测工具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)。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。