一种基于特征选择的程序缺陷定位方法

文档序号:27558747发布日期:2021-11-25 03:08阅读:270来源:国知局
一种基于特征选择的程序缺陷定位方法

1.本发明属于软件系统和人工智能技术领域,具体涉及一种基于特征选择的程序缺陷定位方法。


背景技术:

2.软件系统在当今社会的军事、生活、教育等各个方面占据着重要的地位。随着人们对软件系统依赖性的不断增强,软件系统失效往往给生活和经济带来巨大的损失,尤其在军事、航空等对可靠性有高要求的行业。软件缺陷是导致软件失效的主要因素。软件缺陷的存在可能导致软件系统不能按照预期执行,从而造成误差甚至系统崩溃。为了保证软件正确性,需要软件维护人员及时清除可能导致软件失效的缺陷。
3.当软件系统失效时,需要对软件系统进行纠错性软件维护,将潜在的软件缺陷清除。缺陷定位指的是当软件失效时,查找并定位软件缺陷的过程,是纠错性软件维护的基础。虽然缺陷定位是纠错性软件维护的首要条件,但是人工进行缺陷定位往往是一个冗长而繁复的过程。一方面人工缺陷定位通常依赖软件维护人员的经验和对软件系统的了解,即使经验丰富的软件维护人员也很难迅速定位导致软件系统行为失效的根本原因。另一方面,针对大规模软件系统,人工缺陷定位所消耗的时间较长,软件维护人员需要充分理解源代码后逐步排查。
4.当前主要的缺陷定位方法包括基于覆盖分析的方法、基于程序切片的方法、基于程序不变量的方法、基于模型检验的方法、基于状态变更的方法等。其中大多数方法通过对软件系统的源代码或行为进行建模,查找与软件系统失效相关的代码。根据建模对象的不同,传统的缺陷定位方法可以分为动态分析和静态分析两类。前者通过动态分析程序的行为,如执行路径或状态等,查找相关代码;后者主要通过静态分析软件系统的源代码,从而分析与软件系统失效行为有关的程序元素。
5.虽然自动化缺陷定位的理论和技术得到了很大的发展,但当前的自动缺陷定位仍然面临两个技术难题:1. 随着需求的不断增加,软件系统越来越大,导致缺陷定位的效率降低。因此,适用于大规模软件系统的缺陷定位越来越得到关注。
6.2. 软件系统中潜在的缺陷可能不止一个,多个软件缺陷之间的相互影响可能导致自动缺陷定位的难度提高,准确度下降。尽管目前已经存在部分针对多缺陷的调试技术,但多缺陷的自动定位仍然是不小的挑战。
7.传统的基于覆盖分析的缺陷定位方法,基于启发式的思想使用特定公式计算程序元素的可疑度,其核心思想是被失效用例执行越多、成功用例执行越少的代码可疑度越高。该类方法通常只需要统计测试用例的执行结果和覆盖信息,并根据特定的公式计算代码的可疑度,其优点在于计算复杂度低,面对大规模软件系统时,由于不需要对软件系统的源代码进行建模,因此效率较高。但也存在一定的问题:由于基于覆盖分析的方法不对程序源代码进行建模,而是从统计的角度根据代码被失效和成功覆盖的频率推测代码的可疑度,因
此对于存在多缺陷的程序,难以区分不同缺陷导致的失效用例,忽略不同软件缺陷之间的相互影响,可能导致缺陷定位的准确性降低。其主要原因有两个方面:(1)未被失效用例覆盖的代码可能也包含缺陷;(2)不同软件缺陷共同路径上的正确代码被失效用例覆盖的频率较大,导致可疑度偏高。


技术实现要素:

8.本发明的目的是要解决传统的基于覆盖分析的缺陷定位方法难以区分不同缺陷导致的失效用例,以及忽略不同软件缺陷之间的相互影响的问题,为此,本发明提供一种基于特征选择的程序缺陷定位方法。
9.本发明是通过以下技术方案实现的:一种基于特征选择的程序缺陷定位方法,包括以下步骤:步骤s1,将给定的程序划分为m个程序元素;步骤s2,构造n个测试样例,组成测试样例集;步骤s3,执行各测试样例,记录每个测试样例执行的结果是成功还是失败,并记录各测试样例对程序元素的覆盖情况,得到分支覆盖特征谱;步骤s4,根据得到的分支覆盖特征谱计算各个程序元素的平均缺陷相关统计量;步骤s5,按照各程序元素的平均缺陷相关统计量大小,由大到小,将各程序元素进行排序,然后按序对各程序元素进行代码排查。
10.在上述技术方案中,步骤s4包括以下步骤:步骤s41,将测试样例集d中的测试样例划分为正类测试样例子数据集和负类测试样例子数据集,正类测试样例都是执行成功样例,负类测试样例都是执行失败样例;步骤s42,随机将测试样例集中的测试样例进行排序,排序为c = {,,,...,},n是测试样例的个数;步骤s43,对于第i个测试样例,i为1...n之一,从正类测试样例子数据集和负类测试样例子数据集中各寻找出一个距离
ꢀꢀ
最近的测试样例,其中与同类的测试样例为,与 异类的测试样例为;步骤s44,计算第i个测试样例对于第j个程序元素的缺陷相关统计量的计算公式为:=

*(

diff(,)+diff(,)),其中,代表第i个测试样例对于第j个程序元素的分支覆盖特征,若测试样例覆盖第j个程序元素,则=1,否侧=0 ;表示测试样例的执行结果,当其执行成功时为1,否则为0;代表距离最近的同类测试样例对于第j个程序元素的分支覆盖特征,若测试样例覆盖第j个程序元素,则=1,否则=0;代表距离最近的异类测试样例对于第j个程序元素的分支覆盖特征,若测试样例覆盖第j个程序元素,则=1,否则=0;对于diff(,),若为离散型,如果=,则diff(,)=0,否则diff(,)=1,若为连续型,则diff(,)=||;对于diff(,),若为离散型,如果=,则diff(,)=0,否则diff(
,)=1,若为连续型,diff(,)=||;按照上述计算公式,计算出每一个测试样例对于当前程序元素的缺陷相关统计量,并进行累加,得到当前程序元素对于所有测试样例的缺陷相关统计量总和;步骤s45,将步骤s44得到的当前程序元素对于所有测试样例的缺陷相关统计量总和除以测试样例的总数,得到当前程序元素的平均缺陷相关统计量;步骤s46,按照步骤s44

s45计算出各个程序元素的平均缺陷相关统计量。
11.在上述技术方案中,使用曼哈顿距离来计算两个任意测试样例与之间的距离,寻找出距离
ꢀꢀ
最近的测试样例;两个任意测试样例与之间距离的计算公式为:distance()=,是表示测试样例对第j个程序元素的分支覆盖特征,是表示测试样例对第j个程序元素的分支覆盖特征。
12.在上述技术方案中,步骤s5包括以下步骤:步骤s51,对于排序后的程序元素序列 b = {,,,...,},从开始按序排查,如果是分支结构的一个分支,排查 所在分支结构的判定语句 ;排查与判定语句
ꢀꢀ
在一个基本代码块内且影响到其判定结果的语句;排查在
ꢀꢀ
内且控制依赖于分支
ꢀꢀ
的语句;步骤s52,如果不是分支结构的一个分支,排查与
ꢀꢀ
同在一个函数的所有必须被执行的可执行语句。
13.本发明的有益效果为:(1)本发明提出了基于相关统计量的缺陷定位方法,从数据的角度分析测试用例的覆盖信息,利用特征选择中特征对分类结果重要性的概念,选择对测试用例执行结果影响较大的分支。
14.(2)该方法在传统的基于覆盖分析的缺陷定位方法上引入了相关统计量,同样不需要对源代码进行建模,计算复杂度较低。(3)针对多缺陷之间相互影响的问题,相关统计量为每个测试用例选择距离最近的同类和异类样本,计算测试用例在每个分支覆盖特征上距离同类和异类的距离,从而计算分支覆盖特征对测试执行结果的重要性。该方法在很大程度上避免了多缺陷之间的相互影响。(4)在开源软件系统上的实验证明,本发明方法相比较传统启发式的基于覆盖分析的缺陷定位方法在准确性上具有一定的提升,通过提高缺陷查找效率缩短了纠错性维护的时间和人力成本。
附图说明
15.图1是本发明提出的基于特征选择的程序缺陷定位方法的基本流程图。
具体实施方式
16.为使本发明的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
17.参见附图1,一种基于特征选择的程序缺陷定位方法,包括以下步骤:步骤s1,将给定的程序划分为m个程序元素。
18.步骤s2,构造n个测试样例,组成测试样例集,不同的测试样例要覆盖不相同的程序元素。
19.步骤s3,执行各测试样例,记录每个测试样例执行的结果是成功还是失败,并记录各测试样例对程序元素的覆盖情况,得到分支覆盖特征谱。
20.步骤s4,根据得到的分支覆盖特征谱计算各程序元素的平均缺陷相关统计量;具体步骤如下:步骤s41,根据测试样例的样本标签将测试样例集d中的测试样例划分为正类测试样例子数据集和负类测试样例子数据集,正类测试样例都是执行成功样例,负类测试样例都是执行失败样例;步骤s42,随机将测试样例集中的测试样例进行排序,排序为c = {,,,...,},n是测试样例的个数,从测试样例开始按序计算;步骤s43,对于第i个测试样例,i为1...n之一,从正类测试样例子数据集和负类测试样例子数据集中各寻找出一个距离
ꢀꢀ
最近的测试样例,其中与同类的测试样例为,与 异类的测试样例为;具体的讲,一个测试样例可视为一个样本
ꢀꢀ
= (, ),其中
ꢀꢀ
表示测试样例 对各程序元素的分支覆盖特征,用 = {, ,
ꢀꢀ
,...,} 来表示,其中,表示测试样例 对第m个程序元素的分支覆盖特征,m为程序元素总数;对于一个测试样例 对第j个程序元素的分支覆盖特征来说(j=1、2...m),若测试样例覆盖第j个程序元素,则=1,反之(即没有覆盖)则=0 ;表示测试样例的执行结果,当执行成功时为1,反之为0;在本实施例中,使用曼哈顿距离来计算两个任意测试样例与之间的距离,寻找出距离
ꢀꢀ
最近的测试样例。两个任意测试样例与之间距离的计算公式为:distance()=,是表示测试样例对第j个程序元素的分支覆盖特征,是表示测试样例对第j个程序元素的分支覆盖特征;步骤s44,计算第i个测试样例对于第j个程序元素的缺陷相关统计量的计算公式为:=

*(

diff(,)+diff(,)),其中,代表第i个测试样例对于第j个程序元素的分支覆盖特征,若测试样例覆盖第j个程序元素,则=1,否侧=0 ;表示测试样例的执行结果,当其执行成功时为1,否则为0;代表距离最近的同类测试样例对于第j个程序元素的分支覆盖特征,若测试样例覆盖第j个程序元素,则=1,否则=0;代表距离最近的异类测试样例对于第j个程序元素的分支覆盖特征,若测试样例覆盖第j个程序元素,则=1,否则=0;对于diff(,),若为离散型,
如果=,则diff(,)=0,否则diff(,)=1,若为连续型,则diff(,)=||;对于diff(,),若为离散型,如果=,则diff(,)=0,否则diff(,)=1,若为连续型,diff(,)=||;按照上述计算公式,计算出每一个测试样例对于当前程序元素的缺陷相关统计量,并进行累加,得到当前程序元素对于所有测试样例的缺陷相关统计量总和;步骤s45,将步骤s44得到的当前程序元素对于所有测试样例的缺陷相关统计量总和除以测试样例的总数,得到当前程序元素的平均缺陷相关统计量;步骤s46,按照步骤s44

s45计算出各个程序元素的平均缺陷相关统计量。
21.步骤s5,将步骤s46得到的各程序元素的平均缺陷相关统计量看作是评价各程序元素缺陷可疑度的指标,平均缺陷相关统计量越大表示缺陷可疑度越大;将各程序元素的平均缺陷相关统计量由高到低排序,然后按序进行代码排查。
22.其中,所述将程序元素排序后按序进行代码排查包括以下步骤:步骤s51,对于排序后的程序元素序列 b = {,,,...,},从开始按序排查,如果是分支结构的一个分支,排查 所在分支结构的判定语句 ;排查与判定语句
ꢀꢀ
在一个基本代码块内且影响到其判定结果的语句;排查在
ꢀꢀ
内且控制依赖于分支
ꢀꢀ
的语句;步骤s52,如果不是分支结构的一个分支,排查与
ꢀꢀ
同在一个函数的所有必须被执行的可执行语句。
23.在本发明一应用实例中,对于单缺陷程序,当代码排查率小于20% 时,根据缺陷相关统计量可以定位到 84 个缺陷,对于多缺陷程序,当缺陷个数较多时,相比于one

och方法(使用 ochiai公式计算可疑度的
ꢀ“
one

bug

at

a

time”算法)和par

och 方法(使用 ochiai公式计算可疑度的基于聚类分析的并行算法),本发明方法定位效率变化较小,体现出一定的优势,突出了本发明的有效性。
24.应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1