CN107247663B - 一种冗余变异体识别方法 - Google Patents

一种冗余变异体识别方法 Download PDF

Info

Publication number
CN107247663B
CN107247663B CN201710329693.2A CN201710329693A CN107247663B CN 107247663 B CN107247663 B CN 107247663B CN 201710329693 A CN201710329693 A CN 201710329693A CN 107247663 B CN107247663 B CN 107247663B
Authority
CN
China
Prior art keywords
variant
program
block
tested
variable
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
Application number
CN201710329693.2A
Other languages
English (en)
Other versions
CN107247663A (zh
Inventor
孙昌爱
郭新玲
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
University of Science and Technology Beijing USTB
Original Assignee
University of Science and Technology Beijing USTB
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by University of Science and Technology Beijing USTB filed Critical University of Science and Technology Beijing USTB
Priority to CN201710329693.2A priority Critical patent/CN107247663B/zh
Publication of CN107247663A publication Critical patent/CN107247663A/zh
Application granted granted Critical
Publication of CN107247663B publication Critical patent/CN107247663B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

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)
  • Debugging And Monitoring (AREA)

Abstract

本发明提供一种冗余变异体识别方法,能够减少变异测试过程中变异体的执行时间。所述方法包括:比较变异体与待测程序源代码,获取每个变异体的变异位置及变异内容,确定每个变异体所属的块类别;对待测程序源代码进行数据流分析,获取待测程序的数据流信息,结合获取的待测程序的数据流信息,对获取的每个变异体的变异内容上的变量进行分析,确定变异体的变异类型;其中,所述数据流信息包括:每个变量的定义‑使用链;根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义‑使用链,获取满足冗余变异体识别规则的变异体并标记为冗余变异体本发明涉及软件技术领域。

Description

一种冗余变异体识别方法
技术领域
本发明涉及软件技术领域,特别是指一种冗余变异体识别方法。
背景技术
软件测试的一个根本问题是如何通过较少的测试用例尽可能地检测出软件中潜藏的各种故障。软件测试的实践表明,要想找出程序中潜藏的所有故障几乎是不可能的(即完全充分性测试),一种较为可行的办法是尽可能的缩小故障的搜索范围,以便于专门测试某类故障是否存在(相对充分性测试),为此人们提出了基于故障的软件测试。
变异测试是一种基于故障的测试技术。变异测试的基本思想是:测试人员首先根据待测程序的特征向其程序代码中植入各种类型的故障,产生大量的错误程序。产生的一个错误程序称为待测程序的一个变异体,用来模仿某种故障的操作称为“变异算子”,变异算子一般在符合语法前提下仅对待测程序作微小改动。如果执行某个测试用例导致一个变异体与待测程序产生不同的结果,那么称该变异体被“杀死”,即与该变异体相关的故障能够被检测出来,反之称该变异体“存活”。若不存在任何测试用例,使在某一变异体与待测程序上的执行结果不同,则称该变异体为待测程序的一个等价变异体。针对给定的测试用例集,能够“杀死”的变异体数量占所有产生的非等价变异体数量的百分比,称为该测试用例集合的“变异得分”。变异得分可以定量的评估测试用例集的质量,变异得分越高,说明测试用例集杀死的变异体越多,其检测故障的能力越强。
变异测试又称为变异分析,其可行性基于“熟练程序员”假设(通过对待测程序作合乎语法的代码修改,可以模拟熟练程序员的实际编程行为)和“耦合效应”假设(若测试用例可以检测出简单缺陷,则该测试用例也易于检测出更为复杂的缺陷)。变异测试可用于衡量测试用例集的揭错能力,也可以通过 植入错误来系统地模拟被测软件的各种真实缺陷,对已有测试用例集进行辅助评估。变异测试不仅成功应用于C、C#、Java、SQL等不同的编程语言中,开发出了Mothra、Proteum、MuJava、Muclipse等测试支持工具,并成功应用于测试规格说明书和程序模型上。主要应用于单元测试,当前在接口测试、面向对象软件的测试和合约测试等方面都有相关研究进展。研究结果表明,变异测试的故障检测能力强,与手工植入缺陷相比,自动生成的变异体模拟真实软件中的故障效果更佳,具有排错能力强、方便灵活等优点。
尽管如此,作为一种能够有效评估测试用例集质量的技术,变异测试技术并没有广泛应用于工业界,其主要原因如下:变异测试生成的变异体数量庞大且执行时间较长,使得分析过程中的计算开销较大。
发明内容
本发明要解决的技术问题是提供一种冗余变异体识别方法,以解决现有技术所存在的变异体执行时间开销较大的问题。
为解决上述技术问题,本发明实施例提供一种冗余变异体识别方法,包括:
对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件;
比较变异体与待测程序源代码,获取每个变异体的变异位置及变异内容,并根据每个变异体的变异位置和生成的规则文件,确定每个变异体所属的块类别;
对待测程序源代码进行数据流分析,获取待测程序的数据流信息,结合获取的待测程序的数据流信息,对获取的每个变异体的变异内容上的变量进行分析,确定变异体的变异类型;其中,所述数据流信息包括:每个变量的定义-使用链;
根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义-使用链,获取满足冗余变异体识别规则的变异体并标记为冗余变异体。
进一步地,所述对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件包括:
根据预先确定的基本块、选择块和循环块的定义,对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件。
进一步地,一个待测程序对应一个规则文件,一个规则文件包含多条分块规则;
每条分块规则描述了相应程序块在待测程序源代码中的入口行数与出口行数。
进一步地,所述比较变异体与待测程序源代码,获取每个变异体的变异位置及变异内容,并根据每个变异体的变异位置和生成的规则文件,确定每个变异体所属的块类别包括:
比较变异体i与待测程序源代码,获取变异体i的变异行数及变异内容;
遍历规则文件中的分块规则,判定变异体i的变异行数是否属于分块规则BRj定义的程序块范围;
若不属于分块规则BRj定义的程序块范围,则继续对比规则文件中的下条分块规则;
若属于分块规则BRj定义的程序块范围,则变异体i属于第j组,第j组的块类别就是变异体i的块类别。
进一步地,所述数据流信息还包括:每个变量的定义位置、使用位置;
所述对待测程序源代码进行数据流分析,获取待测程序的数据流信息包括:
对待测程序源代码进行数据流分析,获取每个函数中每个变量在待测程序源代码中出现的定义位置、使用位置;
根据变量在待测程序源代码中出现的定义位置、使用位置,判断变量属于变量定义或变量使用,并根据变量在待测程序源代码中出现的定义位置、使用位置及判断结果生成定义-使用链。
进一步地,在根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义-使用链,获取满足冗余变异体识别规则的变异体并标记为冗余变异体之前,所述方法还包括:
在程序块层次上采用数据流对不同变异体在变异后的程序状态进行分析;
根据不同变异体在变异后是否出现程序状态改变的原则来定义冗余变异 体识别规则。
进一步地,所述冗余变异体识别规则包括:
若对变量v的一个定义-使用链du(v,s1,s2),当变异算子在变量定义s1处生成变异体集合Mdef,变异算子作用在变量使用s2处生成变异体集合Muse,且s1和s2处于同一个基本块时,Muse是Mdef的冗余变异体。
进一步地,所述冗余变异体识别规则包括:
若对变量v的一个定义-使用链du(v,s1,s2),当变异算子在变量定义s1处生成变异体集合Mdef,变异算子作用在变量使用s2处生成变异体集合Muse,且s2所处的基本块是s1所处基本块的任意个上层块的某个顺接块时,Muse是Mdef的冗余变异体。
进一步地,所述冗余变异体识别规则包括:
若待测程序中存在含有变量v的函数调用,Sm→n为函数m调用函数n的调用语句,变量v在函数n的变量使用s2处使用,且在使用前没有对v的变量定义,则对变量v的一个定义-使用链du(v,Sm→n,s2),当变异算子作用在函数调用语句Sm→n上生成变异体集合Mm→n,变异算子作用在变量使用s2上生成变异体集合Muse,且变量使用s2所处的基本块没有上层块时,Muse是Mm→n的冗余变异体。
进一步地,所述冗余变异体识别规则包括:
若Sprintf表示待测程序中没有变量的输出语句,变异算子作用在谓词表达式φ上生成变异体集合Mφ,变异算子作用在Sprintf上生成变异体集合Mprintf,则当谓词表达式φ所处的选择块或循环块是Sprintf所处的基本块的上层块时,Mprintf是Mφ的冗余变异体。
本发明的上述技术方案的有益效果如下:
上述方案中,对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件;比较变异体与待测程序源代码,获取每个变异体的变异位置及变异内容,并根据每个变异体的变异位置和生成的规则文件,确定每个变异体所属的块类别;对待测程序源代码进行数据流分析,获取待测程序的数据流信息,结合获取的待测程序的数据流信息,对获取的每个变异体的变异内容上的变量进行分析,确定变异体的变异类型;其中,所述数据流信息包括:每个变 量的定义-使用链;根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义-使用链,获取满足冗余变异体识别规则的变异体并标记为冗余变异体。这样,在执行变异测试之前,可以利用本实施例所述的冗余变异体识别方法识别冗余变异体,在进行变异测试时,不需要再执行这些冗余变异体来判断其能不能被杀死,减少了变异测试过程中变异体的数量,从而缩短了变异测试过程中变异体的执行时间,提高了变异测试的效率,有助于变异测试在实践中的推广使用。
附图说明
图1为本发明实施例提供的冗余变异体识别方法的流程示意图。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
本发明针对现有的变异体执行时间开销较大的问题,提供一种冗余变异体识别方法。
为了更好地理解本发明,先对冗余变异体进行简要说明:
在变异测试中,即使只选取5%的变异体子集,能杀死这些变异体子集的测试用例子集依然可以杀死98%以上的变异体。因此,可以推测在变异测试中存在一些变异体,对测试用例集中的所有测试用例来说,当其能杀死变异体A时一定能杀死变异体B,则称变异体B为冗余变异体。冗余变异体的定义如下:给定待测程序源代码p,变异体m1、m2,测试用例集ts,若对
Figure BDA0001292118090000051
都有
Figure BDA0001292118090000052
则变异体m2是相对变异体m1的冗余变异体,记作
Figure BDA0001292118090000053
其中,t表示测试用例;m1(t)、p(t)、m2(t)分别表示测试用例t在变异体m1、待测程序p、变异体m2上的执行结果。
如图1所示,本发明实施例提供的冗余变异体识别方法,包括:
步骤101,对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件;
步骤102,比较变异体与待测程序源代码,获取每个变异体的变异位置及 变异内容,并根据每个变异体的变异位置和生成的规则文件,确定每个变异体所属的块类别;
步骤103,对待测程序源代码进行数据流分析,获取待测程序的数据流信息,结合获取的待测程序的数据流信息,对获取的每个变异体的变异内容上的变量进行分析,确定变异体的变异类型;其中,所述数据流信息包括:每个变量的定义-使用链;
步骤104,根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义-使用链,获取满足冗余变异体识别规则的变异体并标记为冗余变异体。
本发明实施例所述的冗余变异体识别方法,对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件;比较变异体与待测程序源代码,获取每个变异体的变异位置及变异内容,并根据每个变异体的变异位置和生成的规则文件,确定每个变异体所属的块类别;对待测程序源代码进行数据流分析,获取待测程序的数据流信息,结合获取的待测程序的数据流信息,对获取的每个变异体的变异内容上的变量进行分析,确定变异体的变异类型;其中,所述数据流信息包括:每个变量的定义-使用链;根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义-使用链,获取满足冗余变异体识别规则的变异体并标记为冗余变异体。这样,在执行变异测试之前,可以利用本实施例所述的冗余变异体识别方法识别冗余变异体,在进行变异测试时,不需要再执行这些冗余变异体来判断其能不能被杀死,减少了变异测试过程中变异体的数量,从而缩短了变异测试过程中变异体的执行时间,提高了变异测试的效率,有助于变异测试在实践中的推广使用。
在前述冗余变异体识别方法的具体实施方式中,进一步地,所述对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件包括:
根据预先确定的基本块、选择块和循环块的定义,对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件。
本实施例中,可以根据预先确定的基本块、选择块和循环块的定义,分析待测程序源代码的结构,对待测程序源代码进行程序块的划分,确定待测程序 的各种块结构,并生成规则文件。
本实施例中,基本块、选择块、循环块的定义如下:
定义1(基本块):
Figure DEST_PATH_GDA0001387731810000075
Figure DEST_PATH_GDA0001387731810000076
其中,BasicBlock表示基本块;Statementi表示待测程序中的逻辑语句行i,Statementi,...,j表示由逻辑语句i到j构成的逻辑语句行的段;Statementx<Statementy当且仅当Statementx执行后立即执行Statementy;其中,∧表示逻辑联接词“与”,
Figure DEST_PATH_GDA0001387731810000073
表示逻辑联接词“取反”,
Figure DEST_PATH_GDA0001387731810000074
表示存在量词。
定义2(选择块):
选择块(ChoiceBlock)表示谓词表达式φ及其控制的选择执行的代码区域Regioni所组成的执行区域。ChoiceBlock=(φ)<Regioni;其中,φ表示其值可取true或false的谓词表达式;Regioni表示基本块、选择块、循环块或者它们之间组合的一个控制依赖区域。
定义3(循环块):
循环块(LoopBlock)表示当循环谓词表达式满足时,选择重复执行的代码区域Regioni。LoopBlock=((φ)<Regioni)+;其中,φ表示其值可取true或false的谓词表达式;Regioni表示基本块、选择块、循环块或者它们之间组合的一个控制依赖区域;只有当谓词表达式φ为true时,Regioni才会执行。
基本块、选择块、循环块都是代码序列中一组顺序执行的语句序列,只有一个入口和一个出口。而划分块的实质就是定义入口和出口语句。基本块、选择块、循环块都之间存在以下的块关系:
定义4(上层块关系(UpperBlock)):
Bj是Bi的上层块关系(Bj=UpperBlock(Bi)),当且仅当满足以下条件:
(1)Bi,Bj∈BasicBlock∨ChoiceBlock∨LoopBlock;其中,∨表示逻辑联接 词“或”;
(2)如果Bj执行可能引起Bi执行,而且Bi执行后Bj继续执行。
定义5(顺接块关系(NextBlock)):
Bj是Bi的顺接块关系(Bj=NextBlock(Bi)),当且仅当满足以下条件:
(1)Bi,Bj∈BasicBlock∨ChoiceBlock∨LoopBlock;
(2)如果Bi执行必然引起Bj执行,而Bj执行不会导致Bi执行。
在前述冗余变异体识别方法的具体实施方式中,进一步地,一个待测程序对应一个规则文件,一个规则文件包含多条分块规则;
每条分块规则描述了相应程序块在待测程序源代码中的入口行数与出口行数。
本实施例中,一个待测程序对应一个规则文件,一个规则文件包含多条分块规则(BR);所述规则文件中包含的分块规则描述了待测程序源代码行数与程序块号之间的关系;具体的,每条分块规则描述了相应程序块在待测程序源代码中的入口行数RI与出口行数RO,可以表示为:BR={<RI,RO>}。
本实施例中,由于变异测试生成的变异体数量较多,需要自动化实现变异体变异位置分析,否则手动比较所有变异体和待测程序源代码会耗费大量时间,为此需要编写相应的分析脚本,该脚本能够自动化逐个比较变异体与待测程序源代码,提取变异体变异位置信息。
本实施例中,根据编写的脚本,逐个比较变异体与待测程序源代码的不同之处,获取所有变异体的变异位置(具体为:变异行数)及变异内容,并根据变异体的变异位置确定变异体所属的块类别。例如,可以使用diff命令对比待测程序源代码和变异体,获取变异体的变异行数及变异内容,截取变异体的变异行数Rd,然后遍历分块规则文件中的分块规则,判定Rd是否属于分块规则BRj定义的程序块范围内;若不属于,则继续对比下条分块规则;若属于,则该变异体属于第j组,则第j组的块类别就是变异体的块类别。
本实施例中,以变异体i为例,作为一可选实施例,所述比较变异体与待测程序源代码,获取每个变异体的变异位置及变异内容,并根据每个变异体的变异位置和生成的规则文件,确定每个变异体所属的块类别包括:
比较变异体i与待测程序源代码,获取变异体i的变异行数及变异内容;
遍历规则文件中的分块规则,判定变异体i的变异行数是否属于分块规则BRj定义的程序块范围;
若不属于分块规则BRj定义的程序块范围,则继续对比规则文件中的下条分块规则;
若属于分块规则BRj定义的程序块范围,则变异体i属于第j组,第j组的块类别就是变异体i的块类别。
在前述冗余变异体识别方法的具体实施方式中,进一步地,所述数据流信息还包括:每个变量的定义位置、使用位置;
所述对待测程序源代码进行数据流分析,获取待测程序的数据流信息包括:
对待测程序源代码进行数据流分析,获取每个函数中每个变量在待测程序源代码中出现的定义位置、使用位置;
根据变量在待测程序源代码中出现的定义位置、使用位置,判断变量属于变量定义或变量使用,并根据变量在待测程序源代码中出现的定义位置、使用位置及判断结果生成定义-使用链。
本实施例中,所述对待测程序源代码进行数据流分析,获取待测程序的数据流信息包括具体步骤可以包括:
采用数据流分析技术,逐个分析每个函数的每个变量在待测程序源代码中出现的定义位置、使用位置,根据每个变量在待测程序源代码中出现的定义位置、使用位置,判断每个变量是属于变量定义或变量使用,并根据每个变量的定义位置、使用位置及判断结果生成每个变量的所有定义-使用链。
本实施例中,所述数据流分析技术为静态分析技术。
在前述冗余变异体识别方法的具体实施方式中,进一步地,在根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义-使用链,获取满足冗余变异体识别规则的变异 体并标记为冗余变异体之前,所述方法还包括:
在程序块层次上采用数据流对不同变异体在变异后的程序状态进行分析;
根据不同变异体在变异后是否出现程序状态改变的原则来定义冗余变异体识别规则。
本实施例中,可以定义一组冗余变异体识别规则,逐个分析待测程序的每条定义-使用链,寻找满足冗余变异体识别规则的变异体,标记为冗余变异体。
本实施例中,所述冗余变异体是指如果测试用例集中能杀死变异体A的所有测试用例也一定能杀死变异体B,称变异体B为变异体A的冗余变异体。
本实施例中,定义所述冗余变异体识别规则的思想在于:由于待测程序在某个时刻的状态表现为一组变量的值的集合,变量的定义通常改变程序的状态,而变量的使用是不改变程序状态。当分析两个变异体是否存在冗余关系时,需要在同一时刻分析两个变异体的程序状态,且分析点要设置在变异点靠后的变异体的变异点处分析。在这个分析点处,如果变异体是在变量使用处变异,则该变异对程序状态的改变会直接体现出来;如果变异体是在变量定义处变异,那么该变异对程序状态的改变也会通过变量的使用传播到分析点处。因此,可以,在程序块层次上采用数据流分析确定不同变异体在变异后是否出现类似的程序状态改变来定义冗余变异体识别规则,例如,是否都改变了该分析点处某个变量的值。
本实施例中,为了更好地理解冗余变异体识别规则,先对冗余变异体识别规则中用到的一些概念进行定义:
定义6:
如果模块m调用了模块n,则称m是n的调用模块,记作caller;相应地,n是m的被调用模块,记作callee,并将m调用n记作m→n;如果m调用n时有变量v传递,将m调用n记作
Figure BDA0001292118090000101
定义7(变量定义):
设s是待测程序p中的一条赋值语句,v为s中被赋值的变量,则s为关于v的变量定义,记作def(v,s)。
定义8(变量使用):
设s是待测程序p中的一条语句,v为s出现的变量,并且此时不是对v的赋值,则s为关于v的变量使用,记作use(v,s)。
定义9(定义-使用链):
设在控制流图(CFG)中存在一条从def(v,s1)到use(v,s2)的路径path,且path上不存在def(v,s’)(s1<s’<s2),则du(v,s1,s2)称为变量v的一个定义-使用链。
定义10(定义变异):
变异算子作用在def(v,s)上生成变异体的变异过程称为定义变异,所生成的变异体集合为Mdef,记作def(v,s)→Mdef
定义11(使用变异):
变异算子作用在use(v,s)上的变量v处生成变异体的变异过程称为使用变异,所生成的变异体集合为Muse,记作use(v,s)→Muse
本实施例中,所述冗余变异体识别规则包括:
对变量v的一个定义-使用链du(v,s1,s2),若def(v,s1)→Mdef,use(v,s2)→Muse,且def(v,s1)∈BasicBlocki,use(v,s2)∈BasicBlockj,则当BasicBlocki与BasicBlockj满足以下4种规则时,Muse是Mdef的冗余变异体:
规则1BasicBlocki=BasicBlockj
规则2BasicBlockj=(NextBlock((UpperBlock(BasicBlocki))*))+
规则3s1是函数调用语句
Figure BDA0001292118090000111
且n中不存在def(v,s’)(s’<s2),
Figure BDA0001292118090000112
另外,当程序中存在规则4所述结构时,变异体之间也存在冗余关系:
规则4用Sprintf表示没有变量的输出语句,Sφ表示谓词表达式φ所在的判断语句,若Sφ→Mφ,Sprintf→Mprintf,且Sφ∈Blocki,Sprintf∈BasicBlockj,则 当Blocki=UpperBlock(BasicBlockj),Blocki∈ChoiceBlock∨LoopBlock时
Figure BDA0001292118090000121
本实施例中,作为一可选实施例,所述冗余变异体识别规则包括:
若对变量v的一个定义-使用链du(v,s1,s2),当变异算子在变量定义s1处生成变异体集合Mdef,变异算子作用在变量使用s2处生成变异体集合Muse,且s1和s2处于同一个基本块时,Muse是Mdef的冗余变异体。
本实施例中,作为又一可选实施例,所述冗余变异体识别规则包括:
若对变量v的一个定义-使用链du(v,s1,s2),当变异算子在变量定义s1处生成变异体集合Mdef,变异算子作用在变量使用s2处生成变异体集合Muse,且s2所处的基本块是s1所处基本块的任意个上层块的某个顺接块时,Muse是Mdef的冗余变异体。
本实施例中,作为再一可选实施例,所述冗余变异体识别规则包括:
若待测程序中存在含有变量v的函数调用,Sm→n为函数m调用函数n的调用语句,变量v在函数n的变量使用s2处使用,且在使用前没有对v的变量定义,则对变量v的一个定义-使用链du(v,Sm→n,s2),当变异算子作用在函数调用语句Sm→n上生成变异体集合Mm→n,变异算子作用在变量使用s2上生成变异体集合Muse,且变量使用s2所处的基本块没有上层块时,Muse是Mm→n的冗余变异体。
本实施例中,作为又一可选实施例,所述冗余变异体识别规则包括:
若Sprintf表示待测程序中没有变量的输出语句,变异算子作用在谓词表达式φ上生成变异体集合Mφ,变异算子作用在Sprintf上生成变异体集合Mprintf,则当谓词表达式φ所处的选择块或循环块是Sprintf所处的基本块的上层块时,Mprintf是Mφ的冗余变异体。
本实施例中,所述冗余变异体识别规则可以根据待测程序的不同结构、结合变异体所属的块类别及变异类型,描述在数据流方面冗余变异体的基本特征。确定变异体所属的块类别和变异体变异类型后,可以根据定义的冗余变异体识别规则,逐个分析待测程序的每条定义-使用链,寻找满足冗余变异体识别规则的变异体,标记为冗余变异体。
本实施例中,在执行变异测试之前,可以利用本实施例所述的冗余变异体 识别方法识别冗余变异体,这样,在进行变异测试时,不需要再执行这些冗余变异体来判断其能不能被杀死,减少了执行时变异体的数量,从而缩短了变异体的执行时间,提高了变异测试的效率。而且,随着待测程序规模的扩大,本实施例所述的冗余变异体识别方法使用的时间要远少于执行这些冗余变异体的时间,因此,本实施例所述的冗余变异体识别方法能减少变异测试的执行时间,提高变异测试的效率,对于变异测试技术优化具有十分重要的意义。
根据如下待测程序源代码对本发明实施例提供的冗余变异体识别方法进行详细说明,所述待测程序源代码表示为:
Figure BDA0001292118090000141
首先,对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件;分块结果和分块规则表示为:
程序块1分块结果:BR1={<18,19>},BR1∈BasicBlock;
程序块2分块结果:BR2={<22,22>},BR2∈BasicBlock;
程序块3分块结果:BR3={<24,25>},BR3∈BasicBlock;
程序块4分块结果:BR4={<16,26>},BR4∈ChoiceBlock
程序块5分块结果:BR5={<27,28>},BR5∈BasicBlock;
程序块6分块结果:BR6={<31,32>},BR6∈BasicBlock;
程序块7分块结果:BR7={<29,33>},BR7∈LoopBlock;
程序块8分块结果:BR8={<34,35>},BR8∈BasicBlock;
程序块9分块结果:BR9={<178,178>},BR9∈BasicBlock;
程序块10分块结果:BR10={<180,180>},BR10∈BasicBlock;
程序块11分块结果:BR11={<179,181>},BR11∈ChoiceBlock;
程序块12分块结果:BR12={<200,200>},BR12∈BasicBlock;
程序块13分块结果:BR13={<199,200>},BR13∈ChoiceBlock;
根据分块结果和分块规则可以看出:在函数main()中,BR4=UpperBlock(BR1)=UpperBlock(BR2)=UpperBlock(BR3),BR5=NextBlock(BR4),BR7=UpperBlock(BR6),BR7=NextBlock(BR5),BR8=NextBlock(BR7);在函数print_token()中,BR11=UpperBlock(BR10),BR11=NextBlock(BR9),BR13=UpperBlock(BR12)。
假设待测程序共生成8个变异体,变异位置和变异内容如下表所示:
Figure BDA0001292118090000161
其次,在Linux环境下使用diff命令分析这8个变异体的变异位置及变异内容,可知,变异体M1∈BR1,且对变量fname是定义变异;变异体M2∈BR5,且对变量fname是使用变异,对变量tp是定义变异;变异体M3∈BR5,且对变量tp是使用变异,对变量tok是定义变异;变异体M4∈BR6,且对变量tp是使用变异,对变量tok是定义变异;变异体M5∈BR8,且对变量tok是使用变异;变异体M6∈BR9,且对变量type是定义变异,对变量tok是使用变异;变异体M7是判断谓词变异,M7∈BR13;变异体M8∈BR12,且是在没有变量的输出语句上的变异。
之后,借助Frama-C工具分析可知,在示例代码中,main()函数中有fname,tok,tp三个变量。变量fname在18,19,22,27行出现,其中18,19,22行是变量定义,27行是变量使用,构成du(fname,19,27)和du(fname,22,27)两条定义-使用链。变量tp在27,28,32行出现,其中27行是变量定义,28,32行是变量使用,构成du(tp,27,28)和du(tp,27,32)两条定义-使用链。变量tok在28,29,31,32,34行出现,其中25,32行是变量定义,29,31,34行是变量使用,构成du(tok,28,29),du(tok,28,31),du(tok,28,34),du(tok,31,29),du(tok,31,34)这5条定义-使用链。在print_token()函数中有tok,type两个变量。变量tok是通过其他函数调用作为形参传递过来的,并在178,180行使用,构成du(tok,34,178),du(tok,34,180)等定义-使用链。变量type在178,179,199行出现,其中178行是变量定义,179,199行是变量使用,构成du(type,178,179),du(type,178,199)等定义-使用链。
最后,逐个分析上一步所识别的定义-使用链,根据定义的冗余变异体识别规则识别冗余变异体。
·变量fname:对定义-使用链du(fname,19,27),19行变异生成的变异体为M1,处于BR1基本块;27行在fname处变异生成的一个变异体为M2,处于BR5基本块;且块BR4是块BR1的上层块,块BR5是BR4的顺接块。满足规则2,因此变异体M2是变异体M1的冗余变异体。同理定义-使用链du(fname,22,27)也满足规则2。
·变量tp:对定义-使用链du(tp,27,28),27行变异生成的一个变异体为M2,处于BR5基本块;28行在tp处变异生成的一个变异体为M3,处于BR5基本块。满足规则1,因此变异体M3是变异体M2的冗余变异体。而定义-使用链du(tp,27,32)不满足任何规则。
·变量tok(main()函数):对定义-使用链du(tok,31,34),31行变异生成的一个变异体为M4,处于BR6基本块;34行在tok处变异生成的一个变异体为M5,处于BR8基本块;且块BR7是块BR6的上层块,块BR8是BR7的顺接块。满足规则2,因此变异体M5是变异体M4的冗余变异体。对定 义-使用链du(tok,28,34),28行变异生成的一个变异体为M3,处于BR5基本块;34行在tok处变异生成的一个变异体为M5,处于BR8基本块;且块BR7是块BR5的顺接块,块BR8是BR7的顺接块。满足规则2,因此变异体M5是变异体M3的冗余变异体。其余定义-使用链不满足任何规则。
·变量tok(print_token()函数):main()函数在34行调用print_token()函数,并有变量tok作为参数传递。对定义-使用链du(tok,34,178),34行是函数调用语句,生成的一个变异体为M5;178行变量tok使用,并且print_token()函数在178行之前没有对变量tok重新定义;178行在tok处变异生成的一个变异体为M6,处于BR9基本块;且块BR9没有上层块。满足规则3,因此变异体M6是变异体M5的冗余变异体。其余定义-使用链不满足任何规则。
·在199行判断谓词type==6变异生成M7,200行的一个没有变量的输出语句变异生成M8,由于M7处于BR13选择块,M8处于BR12基本块,且BR13是BR12的上层块,满足规则4,因此变异体M8是变异体M7的冗余变异体。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (6)

1.一种冗余变异体识别方法,其特征在于,包括:
对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件;
比较变异体与待测程序源代码,获取每个变异体的变异位置及变异内容,并根据每个变异体的变异位置和生成的规则文件,确定每个变异体所属的块类别;
对待测程序源代码进行数据流分析,获取待测程序的数据流信息,结合获取的待测程序的数据流信息,对获取的每个变异体的变异内容上的变量进行分析,确定变异体的变异类型;其中,所述数据流信息包括:每个变量的定义-使用链;
根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义-使用链,获取满足冗余变异体识别规则的变异体并标记为冗余变异体;
其中,给定待测程序源代码p,变异体m1、m2,测试用例集ts,若对
Figure FDA0002188051160000011
∈ts,都有
Figure FDA0002188051160000012
则变异体m2是相对变异体m1的冗余变异体,记作
Figure FDA0002188051160000013
其中,t表示测试用例;m1(t)、p(t)、m2(t)分别表示测试用例t在变异体m1、待测程序源代码p、变异体m2上的执行结果;
其中,所述冗余变异体识别规则包括:
若对变量v的一个定义-使用链du(v,s1,s2),当变异算子在变量定义s1处生成变异体集合Mdef,变异算子作用在变量使用s2处生成变异体集合Muse,且s1和s2处于同一个基本块时,Muse是Mdef的冗余变异体;
其中,所述冗余变异体识别规则包括:
若对变量v的一个定义-使用链du(v,s1,s2),当变异算子在变量定义s1处生成变异体集合Mdef,变异算子作用在变量使用s2处生成变异体集合Muse,且s2所处的基本块是s1所处基本块的任意个上层块的某个顺接块时,Muse是Mdef的冗余变异体;
其中,所述冗余变异体识别规则包括:
若待测程序中存在含有变量v的函数调用,Sm→n为函数m调用函数n的调用语句,变量v在函数n的变量使用s2处使用,且在使用前没有对v的变量定义,则对变量v的一个定义-使用链du(v,Sm→n,s2),当变异算子作用在函数调用语句Sm→n上生成变异体集合Mm→n,变异算子作用在变量使用s2上生成变异体集合Muse,且变量使用s2所处的基本块没有上层块时,Muse是Mm→n的冗余变异体;
其中,所述冗余变异体识别规则包括:
若Sprintf表示待测程序中没有变量的输出语句,变异算子作用在谓词表达式φ上生成变异体集合Mφ,变异算子作用在Sprintf上生成变异体集合Mprintf,则当谓词表达式φ所处的选择块或循环块是Sprintf所处的基本块的上层块时,Mprintf是Mφ的冗余变异体。
2.根据权利要求1所述的冗余变异体识别方法,其特征在于,所述对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件包括:
根据预先确定的基本块、选择块和循环块的定义,对待测程序源代码进行程序块的划分,根据程序块划分结果生成规则文件。
3.根据权利要求1或2所述的冗余变异体识别方法,其特征在于,一个待测程序对应一个规则文件,一个规则文件包含多条分块规则;
每条分块规则描述了相应程序块在待测程序源代码中的入口行数与出口行数。
4.根据权利要求1所述的冗余变异体识别方法,其特征在于,所述比较变异体与待测程序源代码,获取每个变异体的变异位置及变异内容,并根据每个变异体的变异位置和生成的规则文件,确定每个变异体所属的块类别包括:
比较变异体i与待测程序源代码,获取变异体i的变异行数及变异内容;
遍历规则文件中的分块规则,判定变异体i的变异行数是否属于分块规则BRj定义的程序块范围;
若不属于分块规则BRj定义的程序块范围,则继续对比规则文件中的下条分块规则;
若属于分块规则BRj定义的程序块范围,则变异体i属于第j组,第j组的块类别就是变异体i的块类别。
5.根据权利要求1所述的冗余变异体识别方法,其特征在于,所述数据流信息还包括:每个变量的定义位置、使用位置;
所述对待测程序源代码进行数据流分析,获取待测程序的数据流信息包括:
对待测程序源代码进行数据流分析,获取每个函数中每个变量在待测程序源代码中出现的定义位置、使用位置;
根据变量在待测程序源代码中出现的定义位置、使用位置,判断变量属于变量定义或变量使用,并根据变量在待测程序源代码中出现的定义位置、使用位置及判断结果生成定义-使用链。
6.根据权利要求1所述的冗余变异体识别方法,其特征在于,在根据确定的变异体所属的块类别和变异体的变异类型,按照预先定义的冗余变异体识别规则,分析待测程序的每条定义-使用链,获取满足冗余变异体识别规则的变异体并标记为冗余变异体之前,所述方法还包括:
在程序块层次上采用数据流对不同变异体在变异后的程序状态进行分析;
根据不同变异体在变异后是否出现程序状态改变的原则来定义冗余变异体识别规则。
CN201710329693.2A 2017-05-11 2017-05-11 一种冗余变异体识别方法 Active CN107247663B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710329693.2A CN107247663B (zh) 2017-05-11 2017-05-11 一种冗余变异体识别方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710329693.2A CN107247663B (zh) 2017-05-11 2017-05-11 一种冗余变异体识别方法

Publications (2)

Publication Number Publication Date
CN107247663A CN107247663A (zh) 2017-10-13
CN107247663B true CN107247663B (zh) 2020-05-08

Family

ID=60017054

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710329693.2A Active CN107247663B (zh) 2017-05-11 2017-05-11 一种冗余变异体识别方法

Country Status (1)

Country Link
CN (1) CN107247663B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108509347B (zh) * 2018-04-20 2020-10-02 四川大学 等价变异体识别方法及装置
CN110334020B (zh) * 2019-06-24 2020-08-11 北京科技大学 一种冗余变异体识别方法及识别装置
CN112967059A (zh) * 2021-05-18 2021-06-15 支付宝(杭州)信息技术有限公司 一种测试资损监控系统的变异智能合约生成方法和系统

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105302719A (zh) * 2015-10-26 2016-02-03 北京科技大学 一种变异测试方法及装置

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105302719A (zh) * 2015-10-26 2016-02-03 北京科技大学 一种变异测试方法及装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
"A path-aware approach to mutant reduction in mutation testing";chang-ai sun;《Information and Software Technology》;20160303;全文 *
《软件测试用例自动生成算法综述》;聂鹏 等;《计算机应用研究》;20120228;401-405,413 *

Also Published As

Publication number Publication date
CN107247663A (zh) 2017-10-13

Similar Documents

Publication Publication Date Title
Shen et al. Automating performance bottleneck detection using search-based application profiling
CN110543421B (zh) 基于测试用例自动生成算法的单元测试自动执行方法
CN104899147B (zh) 一种面向安全检查的代码静态分析方法
US7971193B2 (en) Methods for performining cross module context-sensitive security analysis
US10664601B2 (en) Method and system automatic buffer overflow warning inspection and bug repair
CN105302719B (zh) 一种变异测试方法及装置
Pinto et al. A multi-objective genetic algorithm to test data generation
JP2017045446A (ja) ソフトウェアプログラムを修復する方法、記憶媒体及びシステム
Singh et al. A systematic review on fault based mutation testing techniques and tools for Aspect-J programs
CN107247663B (zh) 一种冗余变异体识别方法
CN105808438B (zh) 一种基于函数调用路径的测试用例复用方法
CN103679038B (zh) 并行程序共享数据类漏洞的检测方法及系统
de Oliveira Neto et al. Full modification coverage through automatic similarity-based test case selection
CN103218297B (zh) 测试数据的筛选方法及装置
Švejda et al. Interpretation-based violation witness validation for C: NitWit
Cai et al. SENSA: Sensitivity analysis for quantitative change-impact prediction
Saini et al. Comparing quality metrics for cloned and non cloned java methods: A large scale empirical study
Huo et al. Interpreting coverage information using direct and indirect coverage
Godboley et al. Enhanced modified condition/decision coverage using exclusive-nor code transformer
US20100313187A1 (en) Method and system for detecting infeasible paths
Debbarma et al. Static and dynamic software metrics complexity analysis in regression testing
Saumya et al. Xstressor: Automatic generation of large-scale worst-case test inputs by inferring path conditions
Frankl et al. An empirical comparison of two safe regression test selection techniques
Dósea et al. How do design decisions affect the distribution of software metrics?
Lyu et al. A coverage analysis tool for the effectiveness of software testing

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