首页> 中国专利> 一种基于变异操作语义稳定性的API误用缺陷检测方法

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

摘要

本发明公开了一种基于变异操作语义稳定性的API误用缺陷检测方法,针对API误用类缺陷,本发明利用特定的变异操作对待检测的代码注入可能的API误用错误,再利用正确代码中多次注入不同误用错误其语义稳定性要高于已存在API误用错误的代码,来区分正确代码和存在API误用错误的代码,从而达到检测API误用缺陷的目的。本发明的主要内容包括:1)提出了一个基于变异操作语义稳定性的API误用缺陷检测整体流程;2)提出了一种从源代码中提取API调用序列的方法;3)提出了一种针对API调用序列的基于变异操作的API误用错误注入方法;4)提出了一种基于自编码器的API调用序列语义特征编码方法;5)提出了一种基于相似语义归一化的语义稳定性评估方法。

著录项

  • 公开/公告号CN114579465A

    专利类型发明专利

  • 公开/公告日2022-06-03

    原文格式PDF

  • 申请/专利权人 南京大学;

    申请/专利号CN202210253375.3

  • 发明设计人 郭新琛;姚远;徐锋;

    申请日2022-03-15

  • 分类号G06F11/36;

  • 代理机构南京乐羽知行专利代理事务所(普通合伙);

  • 代理人李玉平

  • 地址 210023 江苏省南京市栖霞区仙林大道163号

  • 入库时间 2023-06-19 15:32:14

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-06-03

    公开

    发明专利申请公布

说明书

技术领域

本发明涉及一种基于变异操作语义稳定性的API(Application ProgrammingInterface,应用程序编程接口)误用缺陷检测方法,属于软件缺陷检测技术领域。

背景技术

在现代软件的开发过程中API被广泛的使用,开发人员通过调用API可以直接使用其提供的功能,而不需要知道具体的实现细节,从而提高了软件的开发效率。但是由于API本身使用的复杂性、文档资料中相关描述的缺失或者是使用者本身的疏漏等,开发人员有时候会错误的使用API,从而产生API误用缺陷,它会在一定条件下引发运行错误,产生异常的结果或行为。

API误用是指违反了API使用约束的行为,例如违反了调用顺序或者调用条件上的限制,最终可能会导致软件崩溃、缺陷或者漏洞。API误用有多种类别,比如缺少了API调用、缺少了条件检查或者错误的API调用顺序等。例如使用java打开一个文件进行写入,如果写入完成后没有关闭文件就会导致文件写入失败,就属于API误用缺陷。

为了检测API误用缺陷,一种可行的办法是基于规约挖掘,该方法利用数据挖掘的技术从项目的代码中挖掘出API的使用规约,即如何正确的使用API。在得到使用规约后,利用规约去检测项目中是否有违反规约的用法,如果有的话就认为其是可疑的API误用缺陷。较早的方法使用的是频繁项挖掘的技术,该技术可以从代码中提取出使用规约,规约是以一条一条规则的形式存在,然后利用这些规则来检测误用缺陷。后来又有了图挖掘的技术,该技术用图来表示API的用法,该表示与频繁项集相比包含了更多的代码信息,随后从代码中挖掘出一些频繁的子图,利用这些子图来检测误用缺陷。

然而,目前的API误用缺陷检测方法依然存在着一定的不足:一方面利用规约挖掘的方法,本质上认为偏离频繁的用法就是误用,但是频次低的用法仍然可能为正确的用法,所以可能会出现误报;另一方面需要为规约设置合适的置信度,如果有些规约没有提取出来,就可能会产生漏报的情况。

发明内容

发明目的:由于基于规约挖掘的API误用缺陷检测方法,其效果依赖于规约提取的准确性,可能会产生误报漏报的情况,无法很好的区分API的正确用法和错误用法。而考虑到对正确代码中多次注入不同误用错误其语义稳定性要高于已存在API误用错误的代码,为此本发明考虑使用语义稳定性来检测缺陷,提升API误用缺陷检测的效果。

一方面,API误用缺陷往往由于一些元素的改动导致,例如缺少API调用或者缺少相应的检查,通过设计特定的变异操作可以对待检测的代码注入可能的API误用错误;另一方面,通过对正确代码中多次注入不同误用错误其语义稳定性要高于已存在API误用错误的代码,来区分正确代码和存在API误用错误的代码。本发明将两个特点进行结合,提出了基于变异操作语义稳定性的API误用缺陷检测方法——AMDSSMO(API Misuse Detectionbased on Semantic Stability of Mutation Operation)。

技术方案:一种基于变异操作语义稳定性的API误用缺陷检测方法,包括数据预处理、模型训练和缺陷检测三个阶段;

所述数据预处理阶段,通过对项目中的代码进行静态分析,提取出API调用序列;

所述模型训练阶段,通过训练降噪自编码器模型,获得具有泛化能力的API调用序列语义编码器;

所述缺陷检测阶段,通过评估待检测项目中的API调用序列的语义稳定性,对其进行排序输出。

所述数据预处理阶段的目的是对项目中的代码进行静态分析,提取出API用法的表示,即API调用序列,该序列由API调用和控制结构组成。

在提取API的用法时是以一个方法体为单位,获取每个方法体的抽象语法树,从抽象语法树中提取出API调用和控制结构的信息,具体包括:1)提取出的API调用是经过解析后的完全限定名,包括API的方法名、包名和参数类型;2)提取出的控制结构信息包含代码中的多种结构。方法体中的API调用和控制结构以序列的形式共同组成一个对应于该方法体的API调用序列。

此外针对API误用缺陷,在if条件语句中有两类特殊检查会提取成API调用的形式:1)对象检查;2)值检查。

所述模型训练阶段,该阶段的目的是通过训练降噪自编码器模型,获得具有泛化能力的API调用序列语义编码器。该阶段首先根据API误用缺陷的特征设计变异操作,对API调用序列注入错误,完成数据加噪过程,然后使用加噪后的数据训练自编码器模型,来获得具有泛化能力的API调用序列语义编码器。

经过数据预处理阶段得到的API调用序列用x进行表示,首先根据API误用缺陷的特征设计错误注入方法对数据进行加噪,注入错误后的序列

考虑到API误用缺陷一方面涉及到API调用和控制结构,另一方面涉及到三类基本操作:删除、增加、替换,并且在数据预处理阶段将变量的检查也提取成了API调用的形式,所以设计函数Mut如下:

对于一个API调用序列x

1)以设定的概率p注入错误,如注入错误则

2)注入错误时以设定的删除概率p

删除:随机选择序列中的一个API进行删除

增加:随机选择序列中的一个合法位置,增加一个随机的API

替换:随机选择序列中的一个API,替换为另一个随机的API

其中,操作的概率分布是根据真实的缺陷分布情况而定,增加和替换的API来自于序列中API的同一个类。

利用注入错误后的序列训练自编码器模型,该模型结构由编码器Enc和解码器Dec组成,编码器对输入编码得到压缩的中间向量,解码器利用中间向量来重构输入。给定输入模型的序列

模型训练的目标是让重构序列

自编码器的编码器部分是由双向循环神经网络组成,解码器部分是由单向循环神经网络组成。

所述缺陷检测阶段使用基于相似语义归一化的语义稳定性评估方法,评估待检测项目中的API调用序列的语义稳定性:

为了加大正确与错误的API调用序列之间语义稳定性的差距,对错误注入方法进行了改进,设计了一个改进的变异操作增强方法MutAug如下:

对于一个API调用序列x

1)注入错误时以设定的删除概率p

2)删除:序列x中存在若干个API:a

增加:首先随机选择序列中的一个合法位置,然后序列x中API的同类中存在若干个API:a

替换:首先随机选择序列中的一个API,假设其在训练集中的词频为f,然后序列x中API的同类中存在若干个API:a

对于待检测的API调用序列x,首先利用改进后的错误注入方法MutAug对序列x进行多次错误注入,得到n条注入错误后的序列x

x

其中i=1,2,…,n,然后将其输入到训练好的编码器Enc中,编码出表示语义特征的向量z

z

先计算出这些向量的平均向量

其中u,y为两个n维向量,u=(u

令X表示在模型训练阶段使用的训练集中原始序列的集合,t

将待检测项目中所有的API调用序列输入到缺陷检测模块,计算出所有序列语义稳定性的指标s,s越小稳定性越好,s越大稳定性越差,利用s对项目中的序列进行排序,稳定性差的序列疑似度就越高,越有可能隐藏缺陷。

一种计算机设备,该计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行上述计算机程序时实现如上所述的基于变异操作语义稳定性的API误用缺陷检测方法。

一种计算机可读存储介质,该计算机可读存储介质存储有执行如上所述的基于变异操作语义稳定性的API误用缺陷检测方法的计算机程序。

有益效果:与基于规约挖掘的API误用缺陷检测方法相比,本发明提出了一种新的基于变异操作语义稳定性的缺陷检测方法,使用静态分析技术提取出项目代码中的API调用序列,通过训练降噪自编码器模型,来获得一个具有泛化能力的API调用序列语义编码器,最后结合编码器和错误注入方法来评估API调用序列的语义稳定性,给出了一个新的API误用缺陷检测方法,和对比方法在公开数据集上进行了实验对比,结果表明本发明提出的方法具有更好的检测效果。

附图说明

图1为基于变异操作语义稳定性的API误用缺陷检测方法AMDSSMO整体流程图;

图2为本发明实施的流程图。

具体实施方式

下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。

在软件的开发过程中,由于API文档缺乏、开发人员对API使用经验的缺乏等原因会导致API误用类缺陷发生,从而降低了软件的可靠性,增加了软件维护成本。本发明基于变异操作语义稳定性,给出了一个新的API误用缺陷检测方法AMDSSMO(API MisuseDetection based on Semantic Stability of Mutation Operation)。其主要思路是利用特定的变异操作对待检测的代码注入可能的API误用错误,再利用正确代码中多次注入不同误用错误其语义稳定性要高于已存在API误用错误的代码,来区分正确代码和存在API误用错误的代码,从而达到检测API误用缺陷的目的。

如图1所示,一种基于变异操作语义稳定性的API误用缺陷检测方法,包括数据预处理、模型训练和缺陷检测三个阶段;数据预处理阶段,通过对项目中的代码进行静态分析,提取出API调用序列;模型训练阶段,通过训练降噪自编码器模型,获得具有一定泛化能力的API调用序列语义编码器;缺陷检测阶段,通过评估待检测项目中的API调用序列的语义稳定性,对其进行排序输出。

首先数据预处理阶段的目的是对项目中的代码进行静态分析,提取出API用法的表示,即API调用序列,该序列由API调用和控制结构组成。

软件项目通常由多个源文件组成,依次对每个源文件进行静态分析;每个源文件中又可能包含多个方法体,在提取API的用法时是以一个方法体为单位,获取每个方法体的抽象语法树,从抽象语法树中提取出API调用和控制结构的信息,具体包括:1)提取出的API调用是经过解析后的完全限定名,包括API的方法名、包名和参数类型;2)提取出的控制结构信息包含代码中的多种结构,如条件语句if、循环语句for等。方法体中的API调用和控制结构以序列的形式共同组成一个对应于该方法体的API调用序列;

此外针对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为任意常量。

接下来是模型训练阶段,该阶段的目的是通过训练降噪自编码器模型,获得具有一定泛化能力的API调用序列语义编码器。该阶段首先根据API误用缺陷的特征设计变异操作,对API调用序列注入错误,完成数据加噪过程,然后使用加噪后的数据训练自编码器模型,来获得具有一定泛化能力的API调用序列语义编码器。

经过数据预处理阶段得到的API调用序列用x进行表示,首先根据API误用缺陷的特征设计错误注入方法对数据进行加噪,注入错误后的序列

考虑到API误用缺陷一方面涉及到API调用和控制结构,另一方面涉及到三类基本操作:删除、增加、替换,并且在数据预处理阶段将变量的检查也提取成了API调用的形式,所以设计函数Mut如下:

对于一个API调用序列x

1)以设定的概率p注入错误,如注入错误则

2)注入错误时以设定的删除概率p

删除:随机选择序列中的一个API进行删除

增加:随机选择序列中的一个合法位置,增加一个随机的API

替换:随机选择序列中的一个API,替换为另一个随机的API

其中,为了更真实的模拟API误用缺陷,操作的概率分布是根据真实的缺陷分布情况而定,增加和替换的API来自于序列中API的同一个类。

然后利用注入错误后的序列训练自编码器模型,该模型结构由编码器Enc和解码器Dec组成,编码器对输入编码得到压缩的中间向量,解码器利用中间向量来重构输入。给定输入模型的序列

模型在训练时通过最小化损失函数不断调整参数,使解码器输出的重构序列

为了达到该目标,模型在训练过程中会学习到API调用序列的主要特征,该特征包含了序列的语义信息,以便解码器能利用该特征重构出原来的序列,训练完成后得到API调用序列语义编码器Enc,序列经过编码得到的向量z,为API调用序列的语义特征:

自编码器的编码器部分是由双向循环神经网络组成,解码器部分是由单向循环神经网络组成。

最后是缺陷检测阶段,缺陷检测阶段的目的是通过评估待检测项目中的API调用序列的语义稳定性,对其进行排序输出。该阶段结合编码器和错误注入的方法来评估API调用序列的语义稳定性,利用对正确代码中多次注入不同误用错误其语义稳定性要高于已存在API误用错误的代码的特点,来区分正确代码和存在API误用错误的代码。通过对一条API调用序列进行多次错误注入,得到多个代表语义特征的向量,计算出它们的分散程度,作为评估API调用序列语义稳定性的指标,然后利用该指标进行排序,稳定性越差的序列越有可能包含缺陷。

为了加大正确与错误的API调用序列之间语义稳定性的差距,对错误注入方法进行了改进,其思想是:删除高频的API调用引起的语义变化更大;增加低频的API调用引起的语义变化更大;替换频次差距大的API调用引起的语义变化更大。设计函数MutAug如下:

对于一个API调用序列x

1)注入错误时以设定的概率p

2)删除:序列x中存在若干个API:a

增加:首先随机选择序列中的一个合法位置,然后序列x中API的同类中存在若干个API:a

替换:首先随机选择序列中的一个API,假设其在训练集中的词频为f,然后序列x中API的同类中存在若干个API:a

对于待检测的API调用序列x,首先利用改进后的错误注入方法MutAug对序列x进行多次错误注入,得到n条注入错误后的序列x

x

其中i=1,2,…,n,然后将其输入到训练好的编码器Enc中,编码出表示语义特征的向量z

z

先计算出这些向量的平均向量

其中u,y为两个n维向量,u=(u

令X表示在模型训练阶段使用的训练集中原始序列的集合,t

如图2所示,将待检测项目中所有的API调用序列输入到缺陷检测模块,计算出所有序列语义稳定性的指标s,s越小稳定性越好,s越大稳定性越差,利用s对项目中的序列进行排序,稳定性差的序列疑似度就越高,越有可能隐藏缺陷。

显然,本领域的技术人员应该明白,上述的本发明实施例的基于变异操作语义稳定性的API误用缺陷检测方法各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明实施例不限制于任何特定的硬件和软件结合。

AMDSSMO方法的缺陷检测能力的量化评测

1、输入输出数据说明

本发明的方法被运用于MUBench数据集上,该数据集包含由人工收集并确认的API误用缺陷,所有的缺陷来自于真实的开源项目中,数据集中包含了缺陷发生的原因以及位置信息等。我们从中选取了8个开源项目作为待检测项目,其中包括使用较为广泛、且持续维护的开源项目jodatime、testng等,这些项目中共有100个API误用缺陷,项目的具体信息如表1所示。

在获取了训练所需的项目以及待检测项目后,需要经过数据预处理阶段提取出项目中包含的API调用序列,训练项目中的API调用序列用来训练模型,待检测项目中的API调用序列输入到训练好的模型中,根据计算出的语义稳定性对API调用序列进行排序,稳定性差的序列更有可能含有误用缺陷,依据排序结果对缺陷检测的能力进行量化评测。

综上所述,输入是训练所需的项目和待检测项目,输出是该方法在待检测项目上的缺陷检测的量化评测。

2、模型训练与缺陷检测

首先从代码托管平台上收集大量的项目作为训练项目,这里收集的是Java语言项目,但是本发明提出的方法同样可以应用于检测其他编程语言中的API误用缺陷问题。随后对收集到的训练项目进行数据预处理,提取出项目中的API调用序列。

接下来是模型训练阶段,在该阶段通过训练降噪自编码器模型,来获得具有一定泛化能力的API调用序列语义编码器。首先利用错误注入方法,对API调用序列注入错误,完成加噪过程,然后使用注入错误后的序列训练自编码器模型,训练的目标是为了重构出原始的序列,训练完成后自编码器的编码器部分用来编码API调用序列的语义特征,编码器输出的中间向量即为语义特征。

最后是缺陷检测阶段,该阶段用来检测项目中包含的API误用缺陷。首先对待检测项目进行数据预处理,提取出项目中的API调用序列。然后利用前面训练好的编码器以及错误注入方法,评估每一个API调用序列的语义稳定性,根据其对项目中的API调用序列进行排序,排序靠前的用法更有可能是误用缺陷。

3、输出结果

我们比较了传统的基于规约挖掘的方法和本发明提出的方法AMDSSMO,在API误用缺陷数据集上的检测效果,一共选取了5个具有代表性的基于规约挖掘的方法,表2展现了对比方法的名称以及实验的具体结果。其中检测个数的计算方式为:对于每个待检测项目,各种缺陷检测方法根据自己的方法排序出疑似度排名前二十的用法,在这二十个用法中命中的真实误用的个数。该指标也是相关工作常用来比较的指标,反映了不同方法检测缺陷的能力,检测出的缺陷数目越多,对应方法的检测能力越强。可以看到AMDSSMO同对比方法相比,在API误用缺陷的检测效果上有了一定的提高,且证明了基于变异操作语义稳定性的API误用缺陷检测方法在现实中能被合理的应用。

表1实验的项目

表2对比实验的结果

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号