CN112395198B - 一种基于区分子图挖掘的软件缺陷发现方法 - Google Patents
一种基于区分子图挖掘的软件缺陷发现方法 Download PDFInfo
- Publication number
- CN112395198B CN112395198B CN202011303967.9A CN202011303967A CN112395198B CN 112395198 B CN112395198 B CN 112395198B CN 202011303967 A CN202011303967 A CN 202011303967A CN 112395198 B CN112395198 B CN 112395198B
- Authority
- CN
- China
- Prior art keywords
- program
- subgraph
- software
- graph
- control flow
- 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
Links
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/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
-
- 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/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
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)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种基于区分子图挖掘的软件缺陷发现方法,涉及软件工程技术领域。该方法首先针对一个软件项目提取新旧两个版本的软件包,对新旧两个版本的软件包做相同数据预处理,构建程序的控制流图,并保存到文本文件中,获得正负两类图数据集;对保存到文本文件的控制流图中的程序语句进行哈希转化,使控制流图用程序语句哈希转化后的数值来表示;对得到的哈希转化后的正负两类图数据集进行覆盖图挖掘,得到覆盖图集;根据覆盖图集对正负两类图数据集中的控制流图均进行数据向量化;将数据向量化后的控制流图作为特征训练数据来训练极限学习机,采用投票机制得到训练模型,通过测试后的训练模型对待测程序文件进行测试,发现软件缺陷。
Description
技术领域
本发明涉及软件工程技术领域,尤其涉及一种基于区分子图挖掘的软件缺陷发现方法。
背景技术
信息化时代的软件已经深入到日常生活的各个角落,各行各业都离不开软件,因此高质量的软件是必要的。软件的质量和软件中存在的缺陷数量有直接关系,软件中缺陷数量越少,软件质量越高。在软件开发过程中,软件缺陷的产生是不可避免的。开发人员对需求理解不正确以及开发经验不足可能引起性能或产品特征上的缺陷,程序员对逻辑路径或数据范围考虑不周到,如缺失某些边界条件,忽视系统崩溃后数据的异地备份和灾难性恢复等问题均可能产生软件缺陷。有缺陷的软件在运行时可能会出现意料之外的结果,严重时可能会对公司产生巨大的损失,甚至危害到生命安全,尤其是在航空、航天、金融证券和交通领域软件的质量问题更不可被忽视。研究发现,如果在需求阶段修复一个软件缺陷的代价是1的话,在设计阶段修复一个软件缺陷就是它的3到6倍,在编程阶段修复一个软件缺陷是它的大约10倍,而到了产品发布出去时,再去修复一个软件缺陷将会是40到1000倍,可以看出修复软件中一个缺陷的代价不是随时间线性增长,几乎是呈指数增长的。根据IBM的统计报告显示,在软件开发过程中,软件测试需要消耗整个软件开发和运维预算的50%到75%。这表明在软件开发周期中,通过软件测试尽可能减少软件中存在的缺陷是一项非常昂贵的活动。所以在软件开发周期能快速、精确的找到软件缺陷出现的位置是非常有价值,有意义的。
目前的软件缺陷检测方法一般可分为基于静态的缺陷检测和基于动态的缺陷检测。
静态缺陷检测方法是指在不需要运行程序的前提下分析程序源码或目标码。1976年,King首次提出使用符号执行方法的静态软件故障定位技术,实验表明符号执行可以被应用在顺序程序的调试中。1988年,Young等人提出基于符号执行的并发分析技术来检测并发程序中的故障,通过为每一个控制流图分配一个控制线程,路径条件表示符号执行条件,用路径表达式表示符号执行的值,执行程序流图,进行故障定位。2008年,Cellier提出基于形式方法的故障定位技术。2010年,Eichinger F提出用频繁子图挖掘来进行静态缺陷检测。2016年,梁斌等人提出基于频繁项集的静态缺陷检测方法。
动态缺陷检测方法是指通过运行测试用例来跟踪观察程序的执行路径来实现检测。1982年,Weiser第一次提出用程序切片的方法进行软件调试。Sun Jirong等人深入挖掘程序切片方法的可能性,将其应用在故障定位中。2002年,Jones等人基于统计学方法发现执行失败的次数越多,程序语句的故障可能性越高,提出用不同颜色标识语句故障可疑程度的方法,这是基于执行覆盖的动态检测方法。进一步,Renieris和Reiss提出基于集合运算法的执行覆盖的动态检测方法,建立相似程序频谱为基础的最近邻查询方法。2008年,赵建军等人定义了基于FindBugs的检测面向语句的17种故障模式,并提出了XFindBugs系统用于检测AspectJ故障。2006年,徐宝文等人提出了基于组合测试的检测方法。2009年,王新平等人提出了跟踪程序执行轨迹的故障定位方法。
在检测效果方面,有研究表明静态的软件缺陷检测技术要优于动态的软件缺陷检测检测技术。但是,基于静态的软件缺陷检测技术依然存在很多局限性,比如检测结果的准确性和检测效率都有待提升。这是因为很多静态检测方法大都是基于预先抽取的特征进行的。这些特征大多以属性体现的,属性很难体现出语句之间的调用关系。一个程序有缺陷,往往是一个程序的执行逻辑出了问题,逻辑结构是通过语句之间相互调用关系来体现的,而这些调用关系只有通过程序控制流图或程序依赖图才能体现出来的。
图数据在各种科学和商业应用中稳步增长,如生物信息学,安全,网络和社交网络。图模式可以帮助构建强大而直观的模型,以更好地管理和理解复杂结构。因此,它们的使用远远超出传统方法,如关联规则。近几年,图数据挖掘做为一种有效的技术被广泛应用在缺陷检测中,如S Parsa等人根据程序执行路径图与机器学习算法相结合来挖掘软件缺陷。HCheng等人根据程序执行路径图来挖掘区分子图进行训练来挖掘软件缺陷。K.J.等人通过分析程序依赖图发现。频繁子图更可能是正确倾向的编程规则。然而,已有方法依然面临着一些新的挑战,尤其在缺陷检测准确度和缺陷检测效率等问题。
发明内容
本发明要解决的技术问题是针对上述现有技术的不足,提供一种基于区分子图挖掘的软件缺陷发现方法,发现软件中存在的缺陷。
为解决上述技术问题,本发明所采取的技术方案是:一种基于区分子图挖掘的软件缺陷发现方法,包括以下步骤:
步骤1、从软件仓库中获取所需软件项目包,针对一个软件项目提取新旧两个版本的软件包,对新旧两个版本的软件包做相同数据预处理,构建程序的控制流图,并保存到文本文件中,获得两类图数据集,记为正类和负类,具体方法为:
步骤1.1、针对一个项目从软件仓库中的软件项目包中提取新旧两个版本的软件包,采用递归算法对新旧两个版本的软件包提取程序源代码文件集;并且过滤掉与软件缺陷检测不相关的文件,以可编辑的文本存储程序源代码;
步骤1.2、对获取的程序源代码文件集,提取软件项目中所有的方法;
利用代码处理工具软件将软件项目中每个类中的方法提取出来,以可编辑的文本保存;
步骤1.3、对步骤1.2获取的方法采用统一编码方式命名;
步骤1.4、对采用统一编码方式命名后的方法进行降噪处理和方法过滤,删除冗余方法和空方法、仅保留有实际功能的方法集,删除程序中无修改痕迹的方法,具体方法为:
步骤1.4.1、对采用统一编码方式命名后的方法进行降噪处理;通过代码审查工具审查项目新旧两个版本软件包中的对应程序代码,删除程序代码中接口、抽象方法以及方法体,删除新旧两个版本软件包的程序代码中独有的方法,留下共有的方法;
步骤1.4.2、对降噪处理后的方法进行方法过滤,删除程序中无修改痕迹的方法或仅修改变量名的方法;
遍历整个新版本软件包及对应的旧版本软件包中的程序代码中每一个程序方法文件,计算新版本软件包中程序方法文件的大小和旧版本软件包中对应程序方法文件的大小,判断新旧版本两个软件包中对应的程序方法文件大小的差值是否大于给定的阈值,如果大于给定阈值,则这两个方法文件存在内容的修改,保留这两个方法文件;否则这两个方法文件只是变量名称的修改,删除新旧版本两个软件包中的这两个程序方法文件;
步骤1.5、代码规范化;对降噪处理和方法过滤后的程序方法文件中的程序语句按照其语义统一表达,使程序语句的代码规范化;
定义9个规范将程序方法文件中的程序表达式抽象成9种,保留程序语句语义的基础上实现程序语句的统一表达,具体为:
(1)对算术表达式的抽象:将程序中算术表达式被抽象成:“类型+操作符”的形式;
(2)对类成员访问表达式的抽象:所述类成员包括类成员变量和类成员函数;如果访问的类成员变量类型是基本数据类型,则直接用数据类型代替成员变量;如果访问的类成员变量类型是自定义变量,则在自定义变量类型前加上类型出处;如果访问的是类成员函数,则在函数参数列表前加上函数所属的类,函数参数列表用参数类型代替;
(3)对条件表达式的抽象:条件表达式的程序语句包括if语句、for语句和while语句;将if语句抽象成if(Boolean);将For语句和while语句统一转化成while语句并被抽象成while(Boolean);将条件判断语句boolean中的“<”和“>”统一转化成“<”,保持抽象化后程序语句格式一致;
(4)对引用类名的抽象:使用类所在的包名对引用类名进行抽象;
(5)对参数表达式的抽象:采用参数类型代替参数名的方式对参数表达式进行抽象;
(6)对new声明对象表达式的抽象:对于通过new进行对象声明的程序语句采用new紧跟对象类型的方式对new声明对象表达式进行抽象;如果是非自定义类型的对象同样直接采用new+类型名的方式进行抽象;
(7)对函数调用表达式的抽象:采用函数名+参数类型列表的方式对函数调用表达式进行抽象;
(8)对条件选择表达式的抽象:采用变量类型代替变量名的方式对条件选择表达式进行抽象;
(9)对数组访问表达式的抽象:采用变量类型代替变量名的方式对数组访问表达式进行抽象化;
步骤1.6、将规范化后的程序方法文件中的程序语句构建控制流图CFG,保存到文本G中,进而得到两类图数据集,其中一类是旧版本程序文件对应的图数据集,即包含软件缺陷的图数据集,记为负类G-;另一类是新版本程序文件对应的图数据集,即不包含软件缺陷的图数据集,记为正类G+;
步骤2、对保存到文本文件的控制流图中的程序语句进行哈希转化,使每条程序语句在控制流图中被表示成一个数字,进而使控制流图用程序语句哈希转化后的数值来表示;
步骤3、对步骤2得到的哈希转化后的两类图数据集G+和G-进行覆盖图挖掘,得到覆盖图集,具体方法为:
步骤3.1、对哈希转化后的正类图数据集G+,设置支持度阈值为minSup,利用子图匹配算法计算正类图数据集中支持度大于支持度阈值的频繁子图g,得到频繁子图集GF,并保留频繁子图集GF中每个频繁子图的支持度sup(g,G+);
所述频繁子图的支持度sup(g,G+)的计算过程是:给定频繁子图g,遍历整个正类图数据集G+,利用子图匹配算法寻找频繁子图g在正类图数据集G+中的同构子图,保存频繁子图g的同构子图个数,用同构子图个数除以整个正类图数据G+中频繁子图个数,得到频繁子图g在正类图数据集G+中的支持度;
步骤3.2、基于区分度度量函数挖掘频繁子图对应的区分子图;
计算挖掘出的频繁子图集GF中每个频繁子图g在负类图数据集G-中的支持度,记为sup(g,G-);基于得到的频繁子图在正类图数据集和负类图数据集的支持度,利用如下公式所示的区分度公式计算每个频繁子图的区分度,削减掉小于给定区分度阈值的频繁子图,将区分度大于给定阈值的频繁子图作为区分子图,得到区分子图集GD;
其中,di(g)为频繁子图g的区分度,ε为取值范围在0~1之间的常数;
步骤3.3、设定距离阈值δ,对获取的区分子图集GD进一步挖掘,获取区分子图集GD对应的覆盖图集GR;
步骤3.3.1、在区分子图集GD中,计算所有区分子图对应的δ-跳跃模式,并删除被δ-跳跃模式覆盖的区分子图;
所述δ-跳跃模式为:对于区分子图集GD,d是GD中任意一个区分子图,如果区分子图d在区分子图集GD中的跳跃值LVs(d)>δ,那么区分子图d是区分子图集GD里的δ-跳跃模式;
所述区分子图d在区分子图集GD中的跳跃值LVs(d)定义为区分子图d和区分子图集GD中任意真超图之间的Jaccard距离的最小值,如下公式所示:
其中,D(d,d′)为区分子图d在区分子图集GD中的任意真超图d′之间的Jaccard距离,如下公式所示:
其中,T(d)是区分子图集GD中包含区分子图d的图集合,T(d′)是区分子图集GD中包含真超图d′的图集合;
步骤3.3.2、在剩余的区分子图集中循环执行步骤3.3.1搜集覆盖信息,保留能够覆盖剩余区分子图的代表性区分子图构成覆盖图集GR;
步骤4、将正负两类图数据集均按一定比例划分为训练集和测试集,并根据步骤3获取的覆盖图集GR对正负两类图数据集中的控制流图均进行数据向量化;
将正负两类图数据集均按一定比例划分为训练集和测试集,同时,将获取的覆盖图集GR={g1,…,gi,…,gn}作为特征子图集,n为覆盖图个数;对正负两类图数据集划分的训练集和测试集中任意一个控制流图C都用一个特征向量x=[x1,x2,…,xi,…,xn]来表示,通过图匹配算法判断一个被测的制流图C中是否包含给定的覆盖图特征,如果则有xi=1,反之则xi=0;这样将一个控制流图C转化为一个特征向量;
步骤5、将正负两类图数据集划分的训练集中数据向量化后的控制流图作为特征训练数据来训练极限学习机ELM,采用投票机制得到训练模型,并通过测试集中数据向量化的控制流图对训练模型进行测试,进而通过测试后的训练模型对待测程序文件进行测试,发现软件缺陷。
采用上述技术方案所产生的有益效果在于:本发明提供的一种基于区分子图挖掘的软件缺陷发现方法,(1)利用程序的图结构信息,不仅仅考虑程序之间的语法,更多的考虑程序的逻辑关系,不依赖于特定的程序状态信息;(2)提出了一种无损的程序代码预处理框架。该框架通过对源代码进行方法提取、方法对齐、噪音处理、方法过滤以及代码统一规范化等一系列处理,通过冗余处理和筛选,不仅保留了程序语法信息又保留了程序执行的逻辑信息,使将来的挖掘更加高效。(3)最大程度的保留程序的执行信息。将程序代码构建成控制流图,图中节点代表程序语句信息,边代表语句之间的控制结构,边的标签表示程序语句之间的控制信息,最大程度的保留了程序的执行信息,提升缺陷发现的精度。(4)采用区分子图挖掘方法,进一步在区分子图的基础上提出覆盖图挖掘,覆盖图作为代表性的区分子图,进一步减小了数据规模,进而提高了软件缺陷发现的性能。综上所述,使用图方法的缺陷发现能最大的保留程序执行信息,使缺陷的发现精度更高。同时,提出的覆盖图能使发明的缺陷方法更高效。
附图说明
图1为本发明实施例提供的一种基于区分子图挖掘的软件缺陷发现方法的流程图;
图2为本发明实施例提供的构建程序控制流图的框架图;
图3为本发明实施例提供的对降噪处理后的方法进行过滤的流程图;
图4为本发明实施例提供的一段Java程序方法代码图;
图5为本发明实施例提供的另一个Java程序的方法源代码图;
图6为本发明实施例提供的保存控制流图的文本文件;
图7为本发明实施例提供的经过哈希转化后的控制流图;
图8为本发明实施例提供的计算频繁子图的支持度的流程图;
图9为本发明实施例提供的基于区分度度量函数挖掘频繁子图对应的区分子图的流程图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
本实施例以某JAVA程序项目为例,采用本发明的基于区分子图挖掘的软件缺陷发现方法对该项目中的程序文件进行测试,发现软件中存在的缺陷。
本实施例中,一种基于区分子图挖掘的软件缺陷发现方法,如图1所示,包括以下步骤:
步骤1、从软件仓库中获取所需软件项目包,针对一个软件项目提取新旧两个版本的软件包,对新旧两个版本的软件包做相同数据预处理,构建程序的控制流图,如图2所示,并保存到文本文件中,进而获得两类图数据集,记为正类和负类,具体方法为:
步骤1.1、针对一个项目从软件仓库中的软件项目包中提取新旧两个版本的软件包,采用递归算法对新旧两个版本的软件包提取程序源代码文件集;并且过滤掉与软件缺陷检测不相关的文件,以可编辑的文本存储程序源代码;
一个完整Java软件项目包是一个嵌套的文件夹。文件夹中包含JAVA文件、第三方类库、配置文件、标签文件、图片和.jsp文件等。其中,Java源代码文件是软件缺陷检测的数据文件,位于文件夹的最内层。本实施例中,采用递归算法提取所有的Java源代码文件集并且过滤掉与软件缺陷检测不相关的文件,以可编辑的文本存储程序源代码,便于后续数据处理。
步骤1.2、对获取的程序源代码文件集,提取软件项目中所有的方法;
利用代码处理工具软件Understand的API函数将软件项目中每个类中的方法提取出来,以可编辑的文本保存;
步骤1.3、对步骤1.2获取的方法采用统一编码方式命名;本实施例中,每个方法的命名采用:“文件夹名+方法名+参数类型”的统一编码方式命名;
步骤1.4、对采用统一编码方式命名后的方法进行降噪处理和方法过滤,具体包括:删除冗余方法和空方法、仅保留有实际功能的方法集,删除程序中无修改痕迹的方法,目的是减少程序规模、提升挖掘效率和缺陷发现的精度,具体方法为:
步骤1.4.1、对采用统一编码方式命名后的方法进行降噪处理;通过代码审查工具beyong compare审查项目新旧两个版本软件包中的对应程序代码,删除程序代码中接口、抽象方法以及方法体,删除新旧两个版本软件包的程序代码中独有的方法,留下共有的方法;
步骤1.4.2、对降噪处理后的方法进行方法过滤,删除程序中无修改痕迹的方法或仅修改变量名的方法,如图3所示,遍历整个新版本软件包及对应的旧版本软件包中的程序代码中每一个程序方法文件,计算新版本软件包中程序方法文件的大小和旧版本软件包中对应程序方法文件的大小,判断新旧版本两个软件包中对应的程序方法文件大小的差值是否大于给定的阈值,如果大于给定阈值,则这两个方法文件存在内容的修改,保留这两个方法文件;否则这两个方法文件只是变量名称的修改,删除新旧版本两个软件包中的这两个程序方法文件;
步骤1.5、代码规范化;对降噪处理和方法过滤后的程序方法文件中的程序语句按照其语义统一表达,使程序语句的代码规范化,目的是降低编程风格对构建程序流程图的影响;
定义9个规范将程序方法文件中的程序表达式抽象成9种,保留程序语句语义的基础上实现程序语句的统一表达,具体为:
(1)对算术表达式的抽象:将程序中算术表达式被抽象成:“类型+操作符”的形式;例如n++抽象成int++,n--抽象成int--,n+1抽象成int+intconstent,n+m抽象成int+int。该种抽象可减小因变量名的差异对程序语句哈希化的影响;
例如:算数表达式int m=i+100抽象之后变成int=int+intconstent。
(2)对类成员访问表达式的抽象:所述类成员包括类成员变量和类成员函数;如果访问的类成员变量类型是基本数据类型,则直接用数据类型代替成员变量,如double i,x可以表示成double,double;如果访问的类成员变量类型是自定义变量,则在自定义变量类型前加上类型出处,如function f(function为test包下类名),可以表示为test f;如果访问的是类成员函数,则在函数参数列表前加上函数所属的类,函数参数列表用参数类型代替;如add(int a,double b)(add所属类为calculate),可以表示为calculate add(intdouble)。
例如:类成员访问表达式x=Math.sqrt(m)抽象后变成double=math.sqrt(int)。
(3)对条件表达式的抽象:条件表达式的程序语句包括if语句、for语句和while语句;对这种类型的语句,将条件表达式语句单独做抽象化处理。将if语句抽象成if(Boolean);将For语句和while语句统一转化成while语句并被抽象成while(Boolean);将条件判断语句boolean中的“<”和“>”统一转化成“<”,保持抽象化后程序语句格式一致;
例如:条件表达式if(x*x==m)抽象后变成if(int*int==int)。
(4)对引用类名的抽象:使用类所在的包名对引用类名进行抽象,如类成员变量Ff,类F所在的包名为test,则类F的引用类名可以表示成test;
例如表达式int y=test2(i)抽象后是y=org(int),这是因为test2所在包为org。
(5)对参数表达式的抽象:采用参数类型代替参数名的方式对参数表达式进行抽象;例如function(int a)中的int a被抽象成int;如果function(T a)中的T是一种引用类型,则T a可抽象成类T所在的包名,如类T所在包名为test,T a可以表示成test。
例如:表达式double i,x;抽象后是double,double。
(6)对new声明对象表达式的抽象:对于通过new进行对象声明的程序语句采用new紧跟对象类型的方式对new声明对象表达式进行抽象;例如T t=new T();则可将其抽象成newT的形式。如果是非自定义类型的对象同样直接采用new+类型名的方式进行抽象;例如,StringBuffer s=new StringBuffer();可将其抽象成newStringBuffer。
(7)对函数调用表达式的抽象:采用函数名+参数类型列表的方式对函数调用表达式进行抽象;例如函数名(参数类型1,参数类型2,…);这种方式将不同的函数调用表达式统一成一致格式,如f.add(int a,double b)可以表示成f.add(int,double)。
(8)对条件选择表达式的抽象:条件选择表达式可以表示成(布尔表达式)?(变量):(变量),例如,i>j?i:j。采用变量类型代替变量名的方式对条件选择表达式进行抽象;i>j?i:j可以被抽象成int>int?int:int。
例如:条件选择表达式for(i=1;i<1000;i++)抽象后变成While(int;int<intconstent;int++)
(9)对数组访问表达式的抽象:在程序中经常会出现获取数组中第n个元素值,本发明采用变量类型代替变量名的方式对数组访问表达式进行抽象化;如数组访问表达式int a=u[i]可以抽象成int[int]的形式。
本实施例中,该Java项目中一段Java程序方法代码如图4所示,该段方法代码经过代码规范化,将每条语句抽象化后的程序语句如表1所示。相同类型的程序语句被规范化为统一形式,避免因变量名或编程风格不同引起表现形式的差异,为将来程序语句哈希化处理提供了极大便利。
表1程序语句规范化表示
步骤1.6、将规范化后的程序方法文件中的程序语句构建控制流图CFG,保存到文本G中,进而得到两类图数据集,其中一类是旧版本程序文件对应的图数据集,即包含软件缺陷的图数据集,记为负类G-;另一类是新版本程序文件对应的图数据集,即不包含软件缺陷的图数据集,记为正类G+;
本实施例中,调用代码处理工具软件understand自带API函数将规范化后的程序方法文件中的程序语句转化成控制流图,并通过文本文件进行保存。保存控制流图的文本文件有三个区域,分别用于保存控制流图的基本信息、控制流图中节点的基本信息以及保存控制流图的结构信息;
本实施例中,图5是一个Java程序的方法源代码。图6是将图5对应的程序源代码转化成控制流图的文本文件。文本文件中的区域1保存控制流图的基本信息,包括节点、边的颜色和名字等。区域2保存控制流图中节点的基本信息,其中,_N1和_N2表示节点的标号,label的内容是该节点代表的程序语句,shape表示节点的图形形状,color表示该节点的图形颜色;区域3保存控制流图的结构信息,其中,_N1→_N2表示从节点_N1到节点_N2有一条控制流边;区域3中的label表示边的信息,color表示边的颜色,不同颜色表示不同边的类型。例如if语句产生的分支与for语句产生的分支在控制流图中边的颜色会不同。可以看出并不是所有的边都有信息,当出现分支语句时才存在边的信息,即控制信息。所以从文本文件中很难发现程序语句之间的控制结构关系。
步骤2、对保存到文本文件的控制流图中的程序语句进行哈希转化,使每条程序语句在控制流图中被表示成一个数字,进而使控制流图用程序语句哈希转化后的数值来表示;
本实施例中,利用字符串哈希算法BKDRHash将控制流图中每种类型的程序语句中每个字符串中的字符对应的ASCII码乘以系数的n次方求和得到得到哈希值,进而将程序语句哈希成一个数字;例如,字符串“abc”哈希转化的过程如下公式所示:
SUM(abc)=ω2×a+ω1×b+ω0×c
其中,ω为大于1的奇数,幂为从右开始所在位置下标;
哈希转化后,一个控制流图中所有语句都可被哈希成对应的数值。这样控制流图可用被简化为哈希转化后的数值来表示。本实施例中,如图5所示的程序源码生成的如图6所示的控制流图CFG经过哈希转化后对应的控制流图如图7所示。图7中标注为0的节点为控制流图的开始节点和结束节点,边上的标签表示语句之间控制信息,1表示判断条件为true,0表示判断条件为false,每个节点表示程序代码中一条语句,哈希转换后,程序语句间的控制关系在控制流图中很容易被表现出来。
步骤3、对步骤2得到的哈希转化后的两类图数据集G+和G-进行覆盖图挖掘,得到覆盖图集,具体方法为:
步骤3.1、对哈希转化后的正类图数据集G+,设置支持度阈值为minSup,利用子图匹配算法计算正类图数据集中支持度大于支持度阈值的频繁子图g,得到频繁子图集GF,并保留频繁子图集GF中每个频繁子图的支持度sup(g,G+);计算过程是将正类数据作为子图匹配算法的输入,计算大于等于支持度阈值minSup的频繁子图,保留每个频繁子图的支持度记为sup(g,G+);
所述频繁子图的支持度sup(g,G+)的计算过程如图8所示,具体为:给定频繁子图g,遍历整个正类图数据集G+,利用子图匹配算法寻找频繁子图g在正类图数据集G+中的同构子图,保存频繁子图g的同构子图个数,用同构子图个数除以整个正类图数据G+中频繁子图个数,得到频繁子图g在正类图数据集G+中的支持度;
步骤3.2、基于区分度度量函数挖掘频繁子图对应的区分子图,如图9所示;
计算挖掘出的频繁子图集GF中每个频繁子图g在负类图数据集G-中的支持度,记为sup(g,G-);基于得到的频繁子图在正类图数据集和负类图数据集的支持度,利用如下公式所示的区分度公式计算每个频繁子图的区分度,削减掉小于给定区分度阈值的频繁子图,将区分度大于给定阈值的频繁子图作为区分子图,得到区分子图集GD;
其中,di(g)为频繁子图g的区分度,ε为取值范围在0~1之间的常数,用于防止分母出现零的情况;
步骤3.3、设定距离阈值δ,对获取的区分子图集GD进一步挖掘,获取区分子图集GD对应的覆盖图集GR;
步骤3.3.1、在区分子图集GD中,计算所有区分子图对应的δ-跳跃模式,并删除被δ-跳跃模式覆盖的区分子图;
所述δ-跳跃模式为:对于区分子图集GD,d是GD中任意一个区分子图,如果区分子图d在区分子图集GD中的跳跃值LVs(d)>δ,那么区分子图d是区分子图集GD里的δ-跳跃模式;
所述区分子图d在区分子图集GD中的跳跃值LVs(d)定义为区分子图d和区分子图集GD中任意真超图之间的Jaccard距离的最小值,如下公式所示:
其中,D(d,d′)为区分子图d在区分子图集GD中的任意真超图d′之间的Jaccard距离,如下公式所示:
其中,T(d)是区分子图集GD中包含区分子图d的图集合,T(d′)是区分子图集GD中包含真超图d′的图集合;
步骤3.3.2、在剩余的区分子图集中循环执行步骤3.3.1搜集覆盖信息,保留能够覆盖剩余区分子图的代表性区分子图构成覆盖图集GR;
步骤4、根据步骤3获取的覆盖图集GR对正负两类图数据集中的控制流图均进行数据向量化;
将正负两类图数据集均按一定比例划分为训练集和测试集,同时,将获取的覆盖图集GR={g1,…,gi,…,gn}作为特征子图集,n为覆盖图个数;对正负两类图数据集划分的训练集和测试集中任意一个控制流图C都用一个特征向量x=[x1,x2,…,xi,…,xn]来表示,通过图匹配算法判断一个被测的制流图C中是否包含给定的覆盖图特征,如果则有xi=1,反之则xi=0;这样将一个控制流图C转化为一个特征向量;
步骤5、将正负两类图数据集划分的训练集中数据向量化后的控制流图作为特征训练数据来训练极限学习机ELM,采用投票机制得到训练模型,并通过测试集中数据向量化的控制流图对训练模型进行测试,进而通过测试后的训练模型对待测程序文件进行测试,发现软件缺陷。
投票机制的过程是:在训练过程采用M个独立的极限学习机,每个极限学习机的隐层节点数相同,激活函数相同。利用训练数据对每一个极限学习机进行训练,计算出每个极限学习机的隐层输出。同理,在测试过程中让测试数据都经过每一个极限学习机进行测试,在此过程中记录被预测的类标签的数量,根据少数服从多数的原则将数量最多的类标签作为最终测试数据的类别标签。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明权利要求所限定的范围。
Claims (7)
1.一种基于区分子图挖掘的软件缺陷发现方法,其特征在于:包括以下步骤:
步骤1、从软件仓库中获取所需软件项目包,针对一个软件项目提取新旧两个版本的软件包,对新旧两个版本的软件包做相同数据预处理,构建程序的控制流图,并保存到文本文件中,获得两类图数据集,记为正类和负类;
步骤2、对保存到文本文件的控制流图中的程序语句进行哈希转化,使每条程序语句在控制流图中被表示成一个数字,进而使控制流图用程序语句哈希转化后的数值来表示;
步骤3、对步骤2得到的哈希转化后的两类图数据集G+和G-进行覆盖图挖掘,得到覆盖图集,具体方法为:
步骤3.1、对哈希转化后的正类图数据集G+,设置支持度阈值为minSup,利用子图匹配算法计算正类图数据集中支持度大于支持度阈值的频繁子图g,得到频繁子图集GF,并保留频繁子图集GF中每个频繁子图的支持度sup(g,G+);
步骤3.2、基于区分度度量函数挖掘频繁子图对应的区分子图;
步骤3.3、设定距离阈值δ,对获取的区分子图集GD进一步挖掘,获取区分子图集GD对应的覆盖图集GR;
步骤3.3.1、在区分子图集GD中,计算所有区分子图对应的δ-跳跃模式,并删除被δ-跳跃模式覆盖的区分子图;
所述δ-跳跃模式为:对于区分子图集GD,d是GD中任意一个区分子图,如果区分子图d在区分子图集GD中的跳跃值LVs(d)>δ,那么区分子图d是区分子图集GD里的δ-跳跃模式;
所述区分子图d在区分子图集GD中的跳跃值LVs(d)定义为区分子图d和区分子图集GD中任意真超图之间的Jaccard距离的最小值,如下公式所示:
其中,D(d,d′)为区分子图d在区分子图集GD中的任意真超图d′之间的Jaccard距离,如下公式所示:
其中,T(d)是区分子图集GD中包含区分子图d的图集合,T(d′)是区分子图集GD中包含真超图d′的图集合;
步骤3.3.2、在剩余的区分子图集中循环执行步骤3.3.1搜集覆盖信息,保留能够覆盖剩余区分子图的代表性区分子图构成覆盖图集GR;
步骤4、将正负两类图数据集均按一定比例划分为训练集和测试集,并根据步骤3获取的覆盖图集GR对正负两类图数据集中的控制流图均进行数据向量化;
步骤5、将正负两类图数据集划分的训练集中数据向量化后的控制流图作为特征训练数据来训练极限学习机ELM,采用投票机制得到训练模型,并通过测试集中数据向量化的控制流图对训练模型进行测试,进而通过测试后的训练模型对待测程序文件进行测试,发现软件缺陷。
2.根据权利要求1所述的一种基于区分子图挖掘的软件缺陷发现方法,其特征在于:所述步骤1的具体方法为:
步骤1.1、针对一个项目从软件仓库中的软件项目包中提取新旧两个版本的软件包,采用递归算法对新旧两个版本的软件包提取程序源代码文件集;并且过滤掉与软件缺陷检测不相关的文件,以可编辑的文本存储程序源代码;
步骤1.2、对获取的程序源代码文件集,提取软件项目中所有的方法;
利用代码处理工具软件将软件项目中每个类中的方法提取出来,以可编辑的文本保存;
步骤1.3、对步骤1.2获取的方法采用统一编码方式命名;
步骤1.4、对采用统一编码方式命名后的方法进行降噪处理和方法过滤,删除冗余方法和空方法、仅保留有实际功能的方法集,删除程序中无修改痕迹的方法;
步骤1.5、代码规范化;对降噪处理和方法过滤后的程序方法文件中的程序语句按照其语义统一表达,使程序语句的代码规范化;
步骤1.6、将规范化后的程序方法文件中的程序语句构建控制流图CFG,保存到文本G中,进而得到两类图数据集,其中一类是旧版本程序文件对应的图数据集,即包含软件缺陷的图数据集,记为负类G-;另一类是新版本程序文件对应的图数据集,即不包含软件缺陷的图数据集,记为正类G+。
3.根据权利要求2所述的一种基于区分子图挖掘的软件缺陷发现方法,其特征在于:所述步骤1.4的具体方法为:
步骤1.4.1、对采用统一编码方式命名后的方法进行降噪处理;通过代码审查工具审查项目新旧两个版本软件包中的对应程序代码,删除程序代码中接口、抽象方法以及方法体,删除新旧两个版本软件包的程序代码中独有的方法,留下共有的方法;
步骤1.4.2、对降噪处理后的方法进行方法过滤,删除程序中无修改痕迹的方法或仅修改变量名的方法;
遍历整个新版本软件包及对应的旧版本软件包中的程序代码中每一个程序方法文件,计算新版本软件包中程序方法文件的大小和旧版本软件包中对应程序方法文件的大小,判断新旧版本两个软件包中对应的程序方法文件大小的差值是否大于给定的阈值,如果大于给定阈值,则这两个方法文件存在内容的修改,保留这两个方法文件;否则这两个方法文件只是变量名称的修改,删除新旧版本两个软件包中的这两个程序方法文件。
4.根据权利要求2所述的一种基于区分子图挖掘的软件缺陷发现方法,其特征在于:步骤1.5所述代码规范化的具体方法为:
定义9个规范将程序方法文件中的程序表达式抽象成9种,保留程序语句语义的基础上实现程序语句的统一表达,具体为:
(1)对算术表达式的抽象:将程序中算术表达式被抽象成:“类型+操作符”的形式;
(2)对类成员访问表达式的抽象:所述类成员包括类成员变量和类成员函数;如果访问的类成员变量类型是基本数据类型,则直接用数据类型代替成员变量;如果访问的类成员变量类型是自定义变量,则在自定义变量类型前加上类型出处;如果访问的是类成员函数,则在函数参数列表前加上函数所属的类,函数参数列表用参数类型代替;
(3)对条件表达式的抽象:条件表达式的程序语句包括if语句、for语句和while语句;将if语句抽象成if(Boolean);将For语句和while语句统一转化成while语句并被抽象成while(Boolean);将条件判断语句boolean中的“<”和“>”统一转化成“<”,保持抽象化后程序语句格式一致;
(4)对引用类名的抽象:使用类所在的包名对引用类名进行抽象;
(5)对参数表达式的抽象:采用参数类型代替参数名的方式对参数表达式进行抽象;
(6)对new声明对象表达式的抽象:对于通过new进行对象声明的程序语句采用new紧跟对象类型的方式对new声明对象表达式进行抽象;如果是非自定义类型的对象同样直接采用new+类型名的方式进行抽象;
(7)对函数调用表达式的抽象:采用函数名+参数类型列表的方式对函数调用表达式进行抽象;
(8)对条件选择表达式的抽象:采用变量类型代替变量名的方式对条件选择表达式进行抽象;
(9)对数组访问表达式的抽象:采用变量类型代替变量名的方式对数组访问表达式进行抽象化。
5.根据权利要求1-4任一项权利要求所述的一种基于区分子图挖掘的软件缺陷发现方法,其特征在于:步骤3.1所述频繁子图的支持度sup(g,G+)的计算过程为:给定频繁子图g,遍历整个正类图数据集G+,利用子图匹配算法寻找频繁子图g在正类图数据集G+中的同构子图,保存频繁子图g的同构子图个数,用同构子图个数除以整个正类图数据G+中频繁子图个数,得到频繁子图g在正类图数据集G+中的支持度。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011303967.9A CN112395198B (zh) | 2020-11-19 | 2020-11-19 | 一种基于区分子图挖掘的软件缺陷发现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011303967.9A CN112395198B (zh) | 2020-11-19 | 2020-11-19 | 一种基于区分子图挖掘的软件缺陷发现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112395198A CN112395198A (zh) | 2021-02-23 |
CN112395198B true CN112395198B (zh) | 2022-04-22 |
Family
ID=74605924
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011303967.9A Active CN112395198B (zh) | 2020-11-19 | 2020-11-19 | 一种基于区分子图挖掘的软件缺陷发现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112395198B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11948382B2 (en) * | 2020-12-18 | 2024-04-02 | International Business Machines Corporation | Synthesizing hard-negative text training data |
CN114168478B (zh) * | 2021-12-13 | 2024-05-28 | 东北大学 | 一种基于多图多标记学习的软件Bug检测方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101976313A (zh) * | 2010-09-19 | 2011-02-16 | 四川大学 | 基于频繁子图挖掘的异常入侵检测方法 |
WO2015118536A1 (en) * | 2014-02-06 | 2015-08-13 | B.G. Negev Technologies And Applications Ltd., At Ben-Gurion University | Using model-based diagnosis to improve software testing |
CN106991132A (zh) * | 2017-03-08 | 2017-07-28 | 南京信息工程大学 | 一种基于图集重构与图核降维的图分类方法 |
CN110490000A (zh) * | 2019-08-23 | 2019-11-22 | 广西师范大学 | 多图数据中频繁子图挖掘的差分隐私保护方法 |
-
2020
- 2020-11-19 CN CN202011303967.9A patent/CN112395198B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101976313A (zh) * | 2010-09-19 | 2011-02-16 | 四川大学 | 基于频繁子图挖掘的异常入侵检测方法 |
WO2015118536A1 (en) * | 2014-02-06 | 2015-08-13 | B.G. Negev Technologies And Applications Ltd., At Ben-Gurion University | Using model-based diagnosis to improve software testing |
CN106991132A (zh) * | 2017-03-08 | 2017-07-28 | 南京信息工程大学 | 一种基于图集重构与图核降维的图分类方法 |
CN110490000A (zh) * | 2019-08-23 | 2019-11-22 | 广西师范大学 | 多图数据中频繁子图挖掘的差分隐私保护方法 |
Non-Patent Citations (1)
Title |
---|
多样性度量的Top-K区分子图挖掘;王章辉;《计算机科学与探索》;20171231;第11卷(第9期);第1379-1388页 * |
Also Published As
Publication number | Publication date |
---|---|
CN112395198A (zh) | 2021-02-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108614707B (zh) | 静态代码检查方法、装置、存储介质和计算机设备 | |
CN109426615A (zh) | 过程间的空指针解引用检测方法、系统、设备以及介质 | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
CN102339252B (zh) | 基于xml中间模型以及缺陷模式匹配的静态检测系统 | |
Bernardi et al. | Design pattern detection using a DSL‐driven graph matching approach | |
US8312440B2 (en) | Method, computer program product, and hardware product for providing program individuality analysis for source code programs | |
CN112395198B (zh) | 一种基于区分子图挖掘的软件缺陷发现方法 | |
CN111475820A (zh) | 基于可执行程序的二进制漏洞检测方法、系统及存储介质 | |
Zhao et al. | Towards an understanding of change types in bug fixing code | |
CN114510722B (zh) | 增量代码的静态检测方法及检测系统 | |
CN113468525A (zh) | 针对二进制程序的相似漏洞检测方法及装置 | |
Qian et al. | Mining logical clones in software: Revealing high-level business and programming rules | |
Bernardi et al. | Model checking to improve precision of design pattern instances identification in OO systems | |
CN115080448B (zh) | 一种软件代码不可达路径自动检测的方法和装置 | |
CN115039083A (zh) | 逻辑连接程序执行时生成的异步算法合法性验证使能方法 | |
Göde | Clone evolution | |
CN114781330A (zh) | 一种基于需求建模的类型检查方法 | |
Li et al. | Automatically generating functional scenarios from SOFL CDFD for specification inspection | |
CN112464237A (zh) | 一种静态代码安全诊断方法及装置 | |
CN113849814A (zh) | 一种可配置系统漏洞复现系统以及复现方法 | |
Xu et al. | A Survey on Binary Code Vulnerability Mining Technology | |
Nikolaeva et al. | A simple approach to design patterns identification in programming code | |
CN115774558B (zh) | 一种测试案例自动扩展方法及装置 | |
CN118094561A (zh) | 一种基于代码属性图学习的代码漏洞检测方法 | |
Panourgia et al. | Software engineering for deep learning applications: usage of SWEng and MLops tools in GitHub repositories |
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 |