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

一种基于变异操作语义稳定性的API误用缺陷检测方法

2022-06-05 14:14:32 来源:中国专利 TAG:

based on semantic stability of mutation operation)。
8.技术方案:一种基于变异操作语义稳定性的api误用缺陷检测方法,包括数据预处理、模型训练和缺陷检测三个阶段;
9.所述数据预处理阶段,通过对项目中的代码进行静态分析,提取出api调用序列;
10.所述模型训练阶段,通过训练降噪自编码器模型,获得具有泛化能力的api调用序列语义编码器;
11.所述缺陷检测阶段,通过评估待检测项目中的api调用序列的语义稳定性,对其进行排序输出。
12.所述数据预处理阶段的目的是对项目中的代码进行静态分析,提取出api用法的表示,即api调用序列,该序列由api调用和控制结构组成。
13.在提取api的用法时是以一个方法体为单位,获取每个方法体的抽象语法树,从抽象语法树中提取出api调用和控制结构的信息,具体包括:1)提取出的api调用是经过解析后的完全限定名,包括api的方法名、包名和参数类型;2)提取出的控制结构信息包含代码中的多种结构。方法体中的api调用和控制结构以序列的形式共同组成一个对应于该方法体的api调用序列。
14.此外针对api误用缺陷,在if条件语句中有两类特殊检查会提取成api调用的形式:1)对象检查;2)值检查。
15.所述模型训练阶段,该阶段的目的是通过训练降噪自编码器模型,获得具有泛化能力的api调用序列语义编码器。该阶段首先根据api误用缺陷的特征设计变异操作,对api调用序列注入错误,完成数据加噪过程,然后使用加噪后的数据训练自编码器模型,来获得具有泛化能力的api调用序列语义编码器。
16.经过数据预处理阶段得到的api调用序列用x进行表示,首先根据api误用缺陷的特征设计错误注入方法对数据进行加噪,注入错误后的序列表示为:
[0017][0018]
考虑到api误用缺陷一方面涉及到api调用和控制结构,另一方面涉及到三类基本操作:删除、增加、替换,并且在数据预处理阶段将变量的检查也提取成了api调用的形式,所以设计函数mut如下:
[0019]
对于一个api调用序列x
[0020]
1)以设定的概率p注入错误,如注入错误则否则
[0021]
2)注入错误时以设定的删除概率pd、增加概率pa、替换概率ps分别进行删除、增加、替换操作:
[0022]
删除:随机选择序列中的一个api进行删除
[0023]
增加:随机选择序列中的一个合法位置,增加一个随机的api
[0024]
替换:随机选择序列中的一个api,替换为另一个随机的api
[0025]
其中,操作的概率分布是根据真实的缺陷分布情况而定,增加和替换的api来自于序列中api的同一个类。
[0026]
利用注入错误后的序列训练自编码器模型,该模型结构由编码器enc和解码器dec组成,编码器对输入编码得到压缩的中间向量,解码器利用中间向量来重构输入。给定输入模型的序列模型输出的重构序列表示为:
[0027][0028]
模型训练的目标是让重构序列和原始序列x尽可能接近,训练完成后得到api调用序列语义编码器enc,序列经过编码得到的向量z,为api调用序列的语义特征:
[0029][0030]
自编码器的编码器部分是由双向循环神经网络组成,解码器部分是由单向循环神经网络组成。
[0031]
所述缺陷检测阶段使用基于相似语义归一化的语义稳定性评估方法,评估待检测项目中的api调用序列的语义稳定性:
[0032]
为了加大正确与错误的api调用序列之间语义稳定性的差距,对错误注入方法进行了改进,设计了一个改进的变异操作增强方法mutaug如下:
[0033]
对于一个api调用序列x
[0034]
1)注入错误时以设定的删除概率pd、增加概率pa、替换概率ps分别进行删除、增加、替换操作,其中操作的概率分布是根据真实的缺陷分布情况而定
[0035]
2)删除:序列x中存在若干个api:a1,a2,

,an,它们在训练集中出现的词频依次为f1,f2,

,fn,总词频每个api的概率依据概率pi进行采样删除api
[0036]
增加:首先随机选择序列中的一个合法位置,然后序列x中api的同类中存在若干个api:a1,a2,

,an,它们在训练集中出现的词频依次为f1,f2,

,fn,假设f1至fn是从小到大的顺序,总词频每个api的概率依据概率pi进行采样增加api
[0037]
替换:首先随机选择序列中的一个api,假设其在训练集中的词频为f,然后序列x中api的同类中存在若干个api:a1,a2,

,an,它们在训练集中出现的词频依次为f1,f2,

,fn,每个api的概率依据概率pi进行采样替换api。
[0038]
对于待检测的api调用序列x,首先利用改进后的错误注入方法mutaug对序列x进行多次错误注入,得到n条注入错误后的序列xi:
[0039]
xi=mutaug(x)
[0040]
其中i=1,2,

,n,然后将其输入到训练好的编码器enc中,编码出表示语义特征的向量zi:
[0041]
zi=enc(xi)
[0042]
先计算出这些向量的平均向量随后求出这些向量zi到平均向量的平均距离作为评估语义稳定性的指标,其中函数euc为计算两个向量的欧式距离,其计算公式为:
[0043][0044]
其中u,y为两个n维向量,u=(u1,u2,

,un),y=(y1,y2,

,yn)。考虑到不同长度的
序列或者包含不同api的序列语义稳定性有波动,需进行归一化。
[0045]
令x表示在模型训练阶段使用的训练集中原始序列的集合,ti为该集合中的序列,ti∈x,ri为该序列的语义特征向量ri=enc(ti)。利用序列x的语义特征向量z,通过计算向量之间的欧式距离寻找与序列x最接近的n个训练集中的序列ti,距离d计算公式为d=euc(z,ri),考虑到序列长度的影响,ti来自于序列x长度邻域内的序列。用上面的方法同样计算出序列ti的指标则经过归一化后的评估语义稳定性的指标s为:
[0046][0047]
将待检测项目中所有的api调用序列输入到缺陷检测模块,计算出所有序列语义稳定性的指标s,s越小稳定性越好,s越大稳定性越差,利用s对项目中的序列进行排序,稳定性差的序列疑似度就越高,越有可能隐藏缺陷。
[0048]
一种计算机设备,该计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行上述计算机程序时实现如上所述的基于变异操作语义稳定性的api误用缺陷检测方法。
[0049]
一种计算机可读存储介质,该计算机可读存储介质存储有执行如上所述的基于变异操作语义稳定性的api误用缺陷检测方法的计算机程序。
[0050]
有益效果:与基于规约挖掘的api误用缺陷检测方法相比,本发明提出了一种新的基于变异操作语义稳定性的缺陷检测方法,使用静态分析技术提取出项目代码中的api调用序列,通过训练降噪自编码器模型,来获得一个具有泛化能力的api调用序列语义编码器,最后结合编码器和错误注入方法来评估api调用序列的语义稳定性,给出了一个新的api误用缺陷检测方法,和对比方法在公开数据集上进行了实验对比,结果表明本发明提出的方法具有更好的检测效果。
附图说明
[0051]
图1为基于变异操作语义稳定性的api误用缺陷检测方法amdssmo整体流程图;
[0052]
图2为本发明实施的流程图。
具体实施方式
[0053]
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本技术所附权利要求所限定的范围。
[0054]
在软件的开发过程中,由于api文档缺乏、开发人员对api使用经验的缺乏等原因会导致api误用类缺陷发生,从而降低了软件的可靠性,增加了软件维护成本。本发明基于变异操作语义稳定性,给出了一个新的api误用缺陷检测方法amdssmo(api misuse detection based on semantic stability of mutation operation)。其主要思路是利用特定的变异操作对待检测的代码注入可能的api误用错误,再利用正确代码中多次注入不同误用错误其语义稳定性要高于已存在api误用错误的代码,来区分正确代码和存在api误用错误的代码,从而达到检测api误用缺陷的目的。
[0055]
如图1所示,一种基于变异操作语义稳定性的api误用缺陷检测方法,包括数据预
处理、模型训练和缺陷检测三个阶段;数据预处理阶段,通过对项目中的代码进行静态分析,提取出api调用序列;模型训练阶段,通过训练降噪自编码器模型,获得具有一定泛化能力的api调用序列语义编码器;缺陷检测阶段,通过评估待检测项目中的api调用序列的语义稳定性,对其进行排序输出。
[0056]
首先数据预处理阶段的目的是对项目中的代码进行静态分析,提取出api用法的表示,即api调用序列,该序列由api调用和控制结构组成。
[0057]
软件项目通常由多个源文件组成,依次对每个源文件进行静态分析;每个源文件中又可能包含多个方法体,在提取api的用法时是以一个方法体为单位,获取每个方法体的抽象语法树,从抽象语法树中提取出api调用和控制结构的信息,具体包括:1)提取出的api调用是经过解析后的完全限定名,包括api的方法名、包名和参数类型;2)提取出的控制结构信息包含代码中的多种结构,如条件语句if、循环语句for等。方法体中的api调用和控制结构以序列的形式共同组成一个对应于该方法体的api调用序列;
[0058]
此外针对api误用缺陷,在if条件语句中有两类特殊检查会提取成api调用的形式:1)对象检查,例如if(o!=null){o.api();},其中o是一个对象引用类型的变量,针对该类情况会进行数据依赖分析,分析o是否是由上文的api返回,或者在下文的api调用中使用,如果是则会将表达式o!=null提取成null.check()加入到api调用序列中;2)值检查,例如if(i》const){o.api(i);},其中i是一个基本数据类型的变量,针对该类情况会进行数据依赖分析,分析i是否是由上文的api返回,或者在下文的api调用中使用,如果是则会将表达式i》const提取成value.check()加入到api调用序列中,其中》也可以是其他合法的比较操作,如》,《,!=,==等,const为任意常量。
[0059]
接下来是模型训练阶段,该阶段的目的是通过训练降噪自编码器模型,获得具有一定泛化能力的api调用序列语义编码器。该阶段首先根据api误用缺陷的特征设计变异操作,对api调用序列注入错误,完成数据加噪过程,然后使用加噪后的数据训练自编码器模型,来获得具有一定泛化能力的api调用序列语义编码器。
[0060]
经过数据预处理阶段得到的api调用序列用x进行表示,首先根据api误用缺陷的特征设计错误注入方法对数据进行加噪,注入错误后的序列表示为:
[0061][0062]
考虑到api误用缺陷一方面涉及到api调用和控制结构,另一方面涉及到三类基本操作:删除、增加、替换,并且在数据预处理阶段将变量的检查也提取成了api调用的形式,所以设计函数mut如下:
[0063]
对于一个api调用序列x
[0064]
1)以设定的概率p注入错误,如注入错误则否则
[0065]
2)注入错误时以设定的删除概率pd、增加概率pa、替换概率ps分别进行删除、增加、替换操作:
[0066]
删除:随机选择序列中的一个api进行删除
[0067]
增加:随机选择序列中的一个合法位置,增加一个随机的api
[0068]
替换:随机选择序列中的一个api,替换为另一个随机的api
[0069]
其中,为了更真实的模拟api误用缺陷,操作的概率分布是根据真实的缺陷分布情况而定,增加和替换的api来自于序列中api的同一个类。
[0070]
然后利用注入错误后的序列训练自编码器模型,该模型结构由编码器enc和解码器dec组成,编码器对输入编码得到压缩的中间向量,解码器利用中间向量来重构输入。给定输入模型的序列模型输出的重构序列表示为:
[0071][0072]
模型在训练时通过最小化损失函数不断调整参数,使解码器输出的重构序列和原始序列x尽可能相同,即:
[0073][0074]
为了达到该目标,模型在训练过程中会学习到api调用序列的主要特征,该特征包含了序列的语义信息,以便解码器能利用该特征重构出原来的序列,训练完成后得到api调用序列语义编码器enc,序列经过编码得到的向量z,为api调用序列的语义特征:
[0075][0076]
自编码器的编码器部分是由双向循环神经网络组成,解码器部分是由单向循环神经网络组成。
[0077]
最后是缺陷检测阶段,缺陷检测阶段的目的是通过评估待检测项目中的api调用序列的语义稳定性,对其进行排序输出。该阶段结合编码器和错误注入的方法来评估api调用序列的语义稳定性,利用对正确代码中多次注入不同误用错误其语义稳定性要高于已存在api误用错误的代码的特点,来区分正确代码和存在api误用错误的代码。通过对一条api调用序列进行多次错误注入,得到多个代表语义特征的向量,计算出它们的分散程度,作为评估api调用序列语义稳定性的指标,然后利用该指标进行排序,稳定性越差的序列越有可能包含缺陷。
[0078]
为了加大正确与错误的api调用序列之间语义稳定性的差距,对错误注入方法进行了改进,其思想是:删除高频的api调用引起的语义变化更大;增加低频的api调用引起的语义变化更大;替换频次差距大的api调用引起的语义变化更大。设计函数mutaug如下:
[0079]
对于一个api调用序列x
[0080]
1)注入错误时以设定的概率pd,pa,ps,分别进行删除、增加、替换操作,其中操作的概率分布是根据真实的缺陷分布情况而定
[0081]
2)删除:序列x中存在若干个api:a1,a2,

,an,它们在训练集中出现的词频依次为f1,f2,

,fn,总词频每个api的概率依据概率pi进行采样删除api
[0082]
增加:首先随机选择序列中的一个合法位置,然后序列x中api的同类中存在若干个api:a1,a2,

,an,它们在训练集中出现的词频依次为f1,f2,

,fn,假设f1至fn是从小到大的顺序,总词频每个api的概率依据概率pi进行采样增加api
[0083]
替换:首先随机选择序列中的一个api,假设其在训练集中的词频为f,然后序列x中api的同类中存在若干个api:a1,a2,

,an,它们在训练集中出现的词频依次为f1,f2,

,fn,每个api的概率依据概率pi进行采样替换api。
[0084]
对于待检测的api调用序列x,首先利用改进后的错误注入方法mutaug对序列x进行多次错误注入,得到n条注入错误后的序列xi:
[0085]
xi=mutaug(x)
[0086]
其中i=1,2,

,n,然后将其输入到训练好的编码器enc中,编码出表示语义特征的向量zi:
[0087]
zi=enc(xi)
[0088]
先计算出这些向量的平均向量随后求出这些向量zi到平均向量的平均距离作为评估语义稳定性的指标,其中函数euc为计算两个向量的欧式距离,其计算公式为:
[0089][0090]
其中u,y为两个n维向量,u=(u1,u2,

,un),y=(y1,y2,

,yn)。考虑到不同长度的序列或者包含不同api的序列语义稳定性有波动,需进行归一化。
[0091]
令x表示在模型训练阶段使用的训练集中原始序列的集合,ti为该集合中的序列,ti∈x,ri为该序列的语义特征向量ri=enc(ti)。利用序列x的语义特征向量z,通过计算向量之间的欧式距离寻找与序列x最接近的n个训练集中的序列ti,距离d计算公式为d=euc(z,ri),考虑到序列长度的影响,ti来自于序列x长度邻域内的序列。用上面的方法同样计算出序列ti的指标则经过归一化后的评估语义稳定性的指标s为:
[0092][0093]
如图2所示,将待检测项目中所有的api调用序列输入到缺陷检测模块,计算出所有序列语义稳定性的指标s,s越小稳定性越好,s越大稳定性越差,利用s对项目中的序列进行排序,稳定性差的序列疑似度就越高,越有可能隐藏缺陷。
[0094]
显然,本领域的技术人员应该明白,上述的本发明实施例的基于变异操作语义稳定性的api误用缺陷检测方法各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明实施例不限制于任何特定的硬件和软件结合。
[0095]
amdssmo方法的缺陷检测能力的量化评测
[0096]
1、输入输出数据说明
[0097]
本发明的方法被运用于mubench数据集上,该数据集包含由人工收集并确认的api误用缺陷,所有的缺陷来自于真实的开源项目中,数据集中包含了缺陷发生的原因以及位置信息等。我们从中选取了8个开源项目作为待检测项目,其中包括使用较为广泛、且持续维护的开源项目jodatime、testng等,这些项目中共有100个api误用缺陷,项目的具体信息如表1所示。
[0098]
在获取了训练所需的项目以及待检测项目后,需要经过数据预处理阶段提取出项
目中包含的api调用序列,训练项目中的api调用序列用来训练模型,待检测项目中的api调用序列输入到训练好的模型中,根据计算出的语义稳定性对api调用序列进行排序,稳定性差的序列更有可能含有误用缺陷,依据排序结果对缺陷检测的能力进行量化评测。
[0099]
综上所述,输入是训练所需的项目和待检测项目,输出是该方法在待检测项目上的缺陷检测的量化评测。
[0100]
2、模型训练与缺陷检测
[0101]
首先从代码托管平台上收集大量的项目作为训练项目,这里收集的是java语言项目,但是本发明提出的方法同样可以应用于检测其他编程语言中的api误用缺陷问题。随后对收集到的训练项目进行数据预处理,提取出项目中的api调用序列。
[0102]
接下来是模型训练阶段,在该阶段通过训练降噪自编码器模型,来获得具有一定泛化能力的api调用序列语义编码器。首先利用错误注入方法,对api调用序列注入错误,完成加噪过程,然后使用注入错误后的序列训练自编码器模型,训练的目标是为了重构出原始的序列,训练完成后自编码器的编码器部分用来编码api调用序列的语义特征,编码器输出的中间向量即为语义特征。
[0103]
最后是缺陷检测阶段,该阶段用来检测项目中包含的api误用缺陷。首先对待检测项目进行数据预处理,提取出项目中的api调用序列。然后利用前面训练好的编码器以及错误注入方法,评估每一个api调用序列的语义稳定性,根据其对项目中的api调用序列进行排序,排序靠前的用法更有可能是误用缺陷。
[0104]
3、输出结果
[0105]
我们比较了传统的基于规约挖掘的方法和本发明提出的方法amdssmo,在api误用缺陷数据集上的检测效果,一共选取了5个具有代表性的基于规约挖掘的方法,表2展现了对比方法的名称以及实验的具体结果。其中检测个数的计算方式为:对于每个待检测项目,各种缺陷检测方法根据自己的方法排序出疑似度排名前二十的用法,在这二十个用法中命中的真实误用的个数。该指标也是相关工作常用来比较的指标,反映了不同方法检测缺陷的能力,检测出的缺陷数目越多,对应方法的检测能力越强。可以看到amdssmo同对比方法相比,在api误用缺陷的检测效果上有了一定的提高,且证明了基于变异操作语义稳定性的api误用缺陷检测方法在现实中能被合理的应用。
[0106]
表1实验的项目
[0107]
项目名称缺陷数目closure12itext12jodatime40lucene10asterisk-java3chensun15jigsaw3testng5
[0108]
表2对比实验的结果
[0109]
对比方法检测个数
jadet8grouminer4tikanga7dmmc12mudetect32amdssmo42
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

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

相关文献