CN109144882B - 一种基于程序不变量的软件故障定位方法及装置 - Google Patents

一种基于程序不变量的软件故障定位方法及装置 Download PDF

Info

Publication number
CN109144882B
CN109144882B CN201811096080.XA CN201811096080A CN109144882B CN 109144882 B CN109144882 B CN 109144882B CN 201811096080 A CN201811096080 A CN 201811096080A CN 109144882 B CN109144882 B CN 109144882B
Authority
CN
China
Prior art keywords
statement
invariant
test case
suspicious
program
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
CN201811096080.XA
Other languages
English (en)
Other versions
CN109144882A (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.)
Harbin Institute of Technology
Original Assignee
Harbin Institute of Technology
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 Harbin Institute of Technology filed Critical Harbin Institute of Technology
Priority to CN201811096080.XA priority Critical patent/CN109144882B/zh
Publication of CN109144882A publication Critical patent/CN109144882A/zh
Application granted granted Critical
Publication of CN109144882B publication Critical patent/CN109144882B/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/3684Test management for test design, e.g. generating new test cases

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)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种程序不变量的软件故障定位方法及装置。该方法包括:针对目标软件源代码进行语句、值和逻辑表达式级的插桩,采用预设的测试用例集合执行插桩后的源代码,获得执行信息;对预设失败测试用例集合进行聚类,并对每个聚类,选择有助于区分缺陷语句的成功测试用例集合;学习优选成功测试用例集合的执行信息,获得程序不变量集合,包括集合型、真值表型和浮点型范围不变量;根据失败测试用例集合的执行信息和程序不变量集合检测不变量违背,获得可疑语句集合。采用依赖分析过滤掉因故障传播导致的不变量违背误检,统计分析各语句处的不变量违背,计算语句可疑度。本发明提高了软件故障定位的准确性,克服了逻辑表达式缺陷定位漏检问题。

Description

一种基于程序不变量的软件故障定位方法及装置
技术领域
本发明涉及计算机软件技术领域,特别涉及一种基于程序不变量的软件故障定位方法及装置。
背景技术
软件***中常常包含软件缺陷,降低了软件***的可靠性、可用性和安全性。要修正缺陷的一个首要任务是识别缺陷相关的程序元素的位置,进而程序员可以根据可疑程序元素位置及其程序上下文来修改程序从而修正缺陷。然而该过程非常费时费力。软件调试甚至占了整个软件开销的80%。因此亟需自动化的软件故障定位方法。
除了直接为软件开发人员提供支持外,自动化软件错误定位技术还被用于自动化的程序修正中。在修正之前识别可疑的程序语句,用以指导修正工具生成补丁,缩小补丁的搜索空间。因此,自动定位的准确性直接影响修正工具的有效性。
因此如何提高故障定位技术的有效性成为了当前的研究热点。已有研究提出了多种故障定位方法,这些方法各有优缺点,目前尚不存在优于其它所有方法的故障定位技术。
基于程序不变量的故障定位方法的基本思想是:首先使用成功测试用例训练程序不变量集合,然后执行失败测试用例,检测其对程序不变量集合的违背,将其加入候选集合中,作为可能的缺陷位置,将其作为导致失败的原因。该方法的优点是利用成功测试用例学习得到的不变量有助于分析软件的期望行为和属性。
然而该方法的一个难点问题是如何自动识别故障定位中需要的程序属性,即如何定义程序不变量,不适当的不变量会导致漏检或误检。另一个难点问题是该方法对测试用例的质量要求较高,且存在误检和漏检之间的平衡。如果学习的不变量过于宽泛,可能使得真正的失败产生原因没有被包含到不变量违背候选集合中,导致缺陷位置漏检;如果学习的不变量过窄(漏掉了某些不变量),则可能导致大量误检,无法准确定位到软件失效的产生根源。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的基于程序不变量的软件故障定位方法、装置、电子设备和计算机可读存储介质。
本发明的一个实施例提供一种基于程序不变量的软件故障定位方法,包括:
针对目标软件的源代码建立抽象语法树,根据所述抽象语法树对所述目标软件的源代码进行语句级别的插桩、值级别的插桩和逻辑表达式级别的插桩,采用预设的成功测试用例集合和预设的失败测试用例集合执行插桩后的所述目标软件的源代码,获得各个测试用例的执行信息,包括:语句覆盖信息、变量和表达式的值和逻辑表达式真值表;
对所述预设失败测试用例集合进行聚类分析,根据失败覆盖等价划分优先选择准则对预设成功测试用例集合进行筛选,获得优选成功测试用例集合;
学习所述优选成功测试用例集合的执行信息,获得程序不变量集合,所述程序不变量集合中包括集合型不变量、浮点型范围不变量和真值表型不变量;
根据所述失败测试用例集合的执行信息和所述程序不变量集合进行不变量违背检测,获得可疑语句集合。
可选地,在所述获得优选成功测试用例集合之前,所述方法还包括:
将必然巧合测试用例从所述成功测试用例中剔除。
可选地,所述方法还包括:
根据预设的成功测试用例集合的语句覆盖信息和失败测试用例集合的语句覆盖信息获得仅被失败测试用例覆盖的语句,将所述仅被失败测试用例覆盖的语句加入所述可疑语句集合;
根据所述预设的成功测试用例集合的逻辑表达式真值表和失败测试用例集合的逻辑表达式真值表获得永真和/或永假谓词,将所述永真和/或永假谓词所在的语句加入所述可疑语句集合。
可选地,在获得可疑语句集合之后,所述方法还包括:
采用到达定值分析将产生不变量违背的赋值语句及其直接控制依赖语句加入所述可疑语句集合;
采用依赖分析从所述可疑语句集合中过滤掉因故障传播导致的不变量违背误检的可疑语句。
可选地,所述采用到达定值分析将产生不变量违背的赋值语句及其直接控制依赖语句加入所述可疑语句集合,包括:
解析所述目标软件,创建所述目标软件的控制流图;
遍历所述控制流图,采用迭代算法利用数据流方程求解到达定值信息;
根据所述到达定值信息确定所述可疑语句集合中的产生各个不变量违背语句的赋值语句及其直接控制依赖语句;
将所述产生各个不变量违背语句的赋值语句及其直接控制依赖语句加入所述可疑语句集合。
可选地,所述采用依赖分析从所述可疑语句集合中过滤掉因故障传播导致的不变量违背误检的可疑语句,包括:
解析所述目标软件,获得所述目标软件的数据依赖图;
在所述数据依赖图中标记各个失败测试用例的语句节点的不变量违背信息;
根据所述不变量违背信息从所述可疑语句集合中过滤掉因故障传播导致的不变量违背检测确定的可疑语句。
可选地,在获得可疑语句集合之后,所述方法还包括:
统计分析各个失败测试用例产生的不变量违背,计算所述可疑语句集合中各个可疑语句的可疑度,并根据所述各个可疑语句的可疑度对所述各个可疑语句进行排序。
可选地,所述计算所述可疑语句集合中各个可疑语句的可疑度,包括:
根据如下公式计算可疑语句集合中各个可疑语句的可疑度:
Figure BDA0001805577000000041
其中,Sus_Inv(si)是可疑语句si的可疑度;TS为所述预设的成功测试用例集合,|TF|为所述预设的失败测试用例集合中测试用例的总数;vi是数据依赖图中的第i个节点,tf为失败测试用例,confidence(vi,tf,TS)为vi节点执行失败测试用例tf产生不变量违背的置信度;如果vi是依赖分析中判定的失效产生原因,则confidence(v1,tf,TS)=1,否则confidence(vi,tf,TS)=0.1,2≤i≤k。
本发明的另一个实施例提供一种基于程序不变量的软件故障定位装置,包括:
源代码插桩单元,用于针对目标软件的源代码建立抽象语法树,根据所述抽象语法树对所述目标软件的源代码进行语句级别的插桩、值级别的插桩和逻辑表达式级别的插桩,采用预设的成功测试用例集合和预设的失败测试用例集合执行插桩后的所述目标软件的源代码,获得各个测试用例的执行信息,包括:获得语句覆盖信息、变量和表达式的值和逻辑表达式真值表;
测试用例集合处理单元,用于对所述失败测试用例集合进行聚类分析,根据失败覆盖等价划分优先选择准则对所述成功测试用例集合进行筛选,获得优选成功测试用例集合;
不变量集合获取单元,用于学习所述优选成功测试用例集合,获得程序不变量集合,所述程序不变量集合中包括集合型不变量、浮点型范围不变量和真值表型不变量;
可疑语句集合获取单元,根据所述失败测试用例集合的执行信息和所述程序不变量集合进行不变量违背检测,获得可疑语句集合。
本发明的另一个实施例提供一种电子设备,电子设备包括存储器和处理器,存储器和处理器之间通过内部总线通讯连接,存储器存储有能够被处理器执行的程序指令,程序指令被处理器执行时能够实现上述的方法。
本发明的另一个实施例提供一种计算机可读存储介质,计算机可读存储介质存储计算机指令,计算机指令使所述计算机上执行上述方法。
本发明的技术效果是,本发明针对目标软件的源代码进行语句级别的插桩、值级别的插桩和逻辑表达式级别的插桩,采用预设的测试用例集合执行插桩后的目标软件的源代码,获得各个测试用例的执行信息,包括:语句覆盖信息、变量和表达式的值和逻辑表达式真值表;对预设失败测试用例集合进行聚类分析,获得优选成功测试用例集合;学习优选成功测试用例集合的执行信息,获得程序不变量集合,包括集合型不变量、浮点型范围不变量和真值表型不变量;根据失败测试用例集合的执行信息和程序不变量集合进行不变量违背检测,获得可疑语句集合。采用依赖分析从所述可疑语句集合中过滤掉因故障传播导致的不变量违背误检,在此基础上统计分析各语句处的不变量违背,计算语句可疑度。本发明提高了软件故障定位的准确性,克服了逻辑表达式缺陷定位漏检的问题。
附图说明
图1为本发明一个实施例的基于程序不变量的软件故障定位方法的流程示意图;
图2为本发明另一个实施例的基于程序不变量的软件故障定位方法的原理图;
图3为本发明一个实施例的基于程序不变量的软件故障定位装置的结构示意图;
图4为本发明一个实施例的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
程序不变量种类、测试用例的质量、错误传播都会影响故障定位的有效性,需要在定位过程中综合考虑这些影响因素。特别是仍存在以下问题需要进一步分析和解决。
(1)如何自动识别故障定位中需要的程序属性,使其既具有较低的计算复杂度,又能保证故障定位的有效性?
(2)如何选择测试用例集合,使其一方面降低不变量分析的复杂度,另一方面提高定位的有效性?
(3)如何在定位过程中考虑错误状态传播,错误语句的执行对其后续的语句的执行状态的影响,一方面定位可疑的赋值语句,降低漏检,另一方面,去除因错误状态传播导致的误检?
图1为本发明一个实施例的基于程序不变量的软件故障定位方法的流程示意图。如图1所示,本发明实施例的方法包括:
S11:针对目标软件的源代码建立抽象语法树,根据所述抽象语法树对所述目标软件的源代码进行语句级别的插桩、值级别的插桩和逻辑表达式级别的插桩,采用预设的成功测试用例集合和预设的失败测试用例集合执行插桩后的所述目标软件的源代码,获得各个测试用例的执行信息,包括:语句覆盖信息、变量和表达式的值和逻辑表达式真值表;
需要说明的是,变量和表达式的值包括变量值和表达式的值。
程序的抽象语法树充分地表示了程序的语法结构,树的结构便于执行***探针语句,而且便于反向生成源代码,因此基于抽象语法树进行插装。
测试用例优选要用到程序的执行路径信息、不变量分析要用到变量值和逻辑表达式真值表信息,因此在程序的抽象语法树的表示的基础上,执行三种粒度的插桩。
(1)语句级别的插桩:在每条语句处***探针语句,用于收集测试用例执行程序时覆盖的语句行号。
(2)值级别的插桩:对表达式***探针语句,用于收集测试用例集执行程序过程中的变量的值,并根据变量和表达式的类型记录其对应的不变量类型。
(3)逻辑表达式级别的插桩:对逻辑表达式***探针语句,用于收集测试用例执行程序过程中的逻辑表达式的真值表,记录其对应的不变量类型。
具体地,程序插桩步骤如下:
对源代码进行词法分析和语法分析,建立抽象语法树,同时记录下源文件中每条语句所在的行号。
对于负效应表达式首先转换成等价形式的静态单赋值。如:return语句返回一个表达式,复合的逻辑表达式,转换成将表达式赋给临时变量的形式。
遍历抽象语法树,识别需要***探针语句的位置,并在抽象语法树中***输出相应行号的节点。
语句级插桩:对于所有可执行语句,***输出行号的探针语句;
如果是赋值语句等,执行变量值级插桩:则通过语法树获得变量名,通过查找符号表获取变量类型。***探针语句,输出其左值。
如果是逻辑表达式,则执行逻辑表达式级插桩:按照深度优先顺序遍历该子树,对每个子表达式,***探针语句,输出子表达式的值,直到该树所有节点访问完毕,这样在后续的执行过程中该逻辑表达式就可以得到一个真值序列。
***定义输出文件流变量、打开文件流和关闭文件流的语句,以便将执行信息输出到文件中。将抽象语法树反向生成相应的源代码,即可得到插桩后的程序。
然后用测试用例执行插桩后的程序,就可收集并存储程序运行时的执行信息。
S12:对所述预设失败测试用例集合进行聚类分析,根据失败覆盖等价划分优先选择准则对预设成功测试用例集合进行筛选,获得优选成功测试用例集合;
S13:学习所述优选成功测试用例集合的执行信息,获得程序不变量集合,所述程序不变量集合中包括集合型不变量、浮点型范围不变量和真值表型不变量;
程序不变量是程序源代码中恒定满足的公式或规则。当用不同的输入执行程序时,不变量保持不变。
Carrot和Savant基于Daikon推导可能满足的所有预先定义的不变量模式,计算复杂度高,且有些不变量可能是和故障定位无关的,另外,难于充分表示程序控制流相关的程序不变量。
软件缺陷经常会影响程序中的变量和表达式的值,因此通过对比成功执行和失败执行中的变量和表达式的值的差异,有助于定位缺陷。
DIDUCE中的不变量表示和Sahoo等人提出的值范围不变量相对于Daikon推导不变量而言具有较低的复杂度,但给出的不变量形式没有考虑控制流相关的逻辑不变量,因此难于定位逻辑表达式缺陷,且用区间形式表示整型数的范围,容易导致漏检。
因此,本发明实施例改进了Sahoo等人提出的不变量表示形式,分析变量和表达式执行过程中值的情况,并根据变量和表达式的类型,定义如下三种形式的不变量表示形式。
浮点型范围不变量:对于给定的成功测试用例集合TS,程序点p上的浮点型的表达式e的程序不变量记为Inv(p,e,TS)=[a,b]
当且仅当满足以下条件(iff):
Figure BDA0001805577000000081
其中,value(e,ts)表示用测试用例ts执行程序时,表达式e的值。
即,对于给定的成功测试用例集合TS,程序点p上的浮点型的表达式e的程序不变量,是其运行TS中所有成功测试用例学习得到e的值区间范围,a和b是用某个测试用例执行e获得的,a是区间的下界,b是区间的上界。
浮点型范围不变量捕获了浮点型程序变量和表达式的值信息。例如double f;用成功测试用例学习到的f的范围不变量是[1.1,5.7]。
为了有效定位除数为0缺陷,特殊记录是否出现绝对值接近于0的浮点表达式值。定义如下:
如果
Figure BDA0001805577000000082
Inv(p,e,TS)=[a,b]+[0,0]
否则,
Inv(p,e,TS)=[a,b]
浮点型范围不变量适合于分析数组下标越界等缺陷,通过值的范围分析,也可以一定程度上间接地定位对变量和表达式值产生影响的其它类缺陷。
集合型不变量:对于给定的成功测试用例集合TS,程序点p上的整型、字符型、字符串(字符数组或字符指针)类型的表达式e的程序不变量记为Inv(p,e,TS)={value(e,ts)|ts∈TS}。其中value(e,ts)表示用测试用例ts执行程序时,表达式e的值。
即整型、字符型、字符串,不变量是其执行过程中的离散取值集合,这样可以避免不变量范围过于宽泛,有助于减少不变量违背检测过程中的漏检。
真值表型不变量:对于给定的成功测试用例集合TS,程序点p上的多条件逻辑表达式e的程序不变量记为,Inv(p,e,TS)={(Inv(p,e1,ts),Inv(p,e2,ts),value(e,ts))|e1,e2是e的子表达式}。其中value(e,ts)表示用测试用例ts执行程序时,表达式e的值。
即逻辑表达式的不变量形式为其各个子表达式及其该表达式的值构成的真值表。如果e1、e2还包含子表达式,则其真值表由其子表达式真值构成。
S14:根据所述失败测试用例集合的执行信息和所述程序不变量集合进行不变量违背检测,获得可疑语句集合。
用成功测试用例集学习获得程序中特定程序点的不变量,然后检测失败测试用例的执行信息,判定其是否满足不变量,如果不满足,则称产生了不变量违背。
定义(不变量违背):对于给定的成功测试用例集合TS,程序点p上的表达式e,对于失败测试用例tf,如果
Figure BDA0001805577000000092
则称tf在程序点p处的表达式e,产生了不变量违背。则程序点p为可疑程序点。
表1给出了真值表型不变量示例。表中符号⊥表示程序计算截断,即在计算逻辑表达式时,当前一部分表达式的值为真时,不再计算后一部分表达式结果。假设正确表达式为z=x&&y,而程序中将其错误写为z=x||y。在故障定位过程中,通过用成功用例学习,获得逻辑表达式不变量为{000,1⊥1},而失败用例(1,0)执行的真值序列011没有出现在该不变量集合中,因此发生了不变量违背,从而可以定位该逻辑表达式错误。
表1真值表型不变量示例
Figure BDA0001805577000000091
Figure BDA0001805577000000101
用真值表的形式定义逻辑表达式不变量,考虑了程序的表达式的组成结构,避免了单纯的值范围分析对于逻辑表达式只能得到一个固定的0或1值,难于定位逻辑表达式相关缺陷的问题。对于单个条件的表达式则根据表达式类型采用浮点型范围不变量或离散型不变量进行分析。
本发明实施例为了降低复杂度,不推导变量之间可能满足的表达式,而是分析其执行过程中变量和表达式值的情况。为了提高定位的准确性,根据变量和表达式的类型,将程序不变量定义为浮点型范围不变量、集合型不变量和真值表型不变量,并通过值和逻辑表达式级别的程序插桩获得各个测试用例执行程序时相应的变量和表达式值,进而利用成功测试用例的执行信息学习生成不变量。前两种不变量分析变量的执行状态值,有助于定位和数据相关的软件缺陷,后一种分析逻辑表达式,有助于定位和谓词相关的缺陷。解决了已有方法难于分析分支条件表达式,导致逻辑表达式缺陷定位漏检的问题。
在本发明实施例的一种可选的实施方式中,在所述获得优选成功测试用例集合之前,所述方法还包括:
将必然巧合测试用例从所述成功测试用例中剔除。
为了降低不变量违背检测的误检和漏检,提高故障定位的有效性,在测试用例优选过程中充分考虑了失败执行路径对故障定位的影响,步骤如下:
(1)失败测试用例聚类:采用层次聚类,将具有相似语句覆盖信息的失败测试用例聚在同一个类中。每次针对一个失败测试用例聚类进行分析。
(2)去除“必然”巧合正确的测试用例:将语句覆盖与任意失败测试用例语句覆盖相同的成功测试用例,标记为“必然”巧合正确的测试用例,将其从成功测试用例集合中删除。
(3)优选和失败执行路径相似的成功测试用例,并在优选过程中尽量过滤掉“可能”巧合正确的测试用例。采用多准则优化测试用例优选方法[i],根据“失败覆盖向量相似度优先排序”准则,将执行路径与失败执行路径相似的成功测试用例赋予较高的优先级,使得后续学习生成的不变量集合与失败测试用例更加相关,降低不变量违背检测误检和漏检;然后根据“失败覆盖等价划分优化选择”准则,选择能够在最大程度上区分失败执行语句的最小成功测试用例集合,避免学习的不变量范围过于宽泛,有助于降低不变量违背漏检。
进一步地,所述方法还包括:
根据预设的成功测试用例集合的语句覆盖信息和失败测试用例集合的语句覆盖信息获得仅被失败测试用例覆盖的语句,将所述仅被失败测试用例覆盖的语句加入所述可疑语句集合;
根据所述预设的成功测试用例集合的逻辑表达式真值表和失败测试用例集合的逻辑表达式真值表获得永真和/或永假谓词,将所述永真和/或永假谓词所在的语句加入所述可疑语句集合。
如果一条程序语句仅出现在失败路径中,而没有被任何成功测试用例覆盖,该语句很可能是导致失败的可疑语句。例如,在原本正确的程序代码中增加了冗余语句导致程序的执行逻辑错误,或产生错误的计算结果。
仅被失败测试用例覆盖的语句:对于给定的成功测试用例集合TS,失败测试用例集合TF,程序点p上的语句s,如果
Figure BDA0001805577000000115
并且
Figure BDA0001805577000000116
则s是仅被失败测试用例覆盖的可疑语句。
这种情况下,由成功测试用例无法学习获得不变量,更无法检测到不变量违背,因此需要根据测试用例的语句覆盖信息,识别这种可疑语句。
程序中的谓词判定条件通常用于区分不同的情况,对于不同的分支分别作不同的处理。如果在程序的所有执行中,某些谓词判定条件永真或永假,这可能意味着程序中含有某些缺陷,导致谓词判定失败。这种情况下,尽管失败测试用例没有违背成功测试用例学习得到的不变量,但该语句及其相关语句依然为可疑语句。因此需要特殊识别这种永真和/或永假谓词。
永真和/或永假谓词:对于给定的成功测试用例集合TS,失败测试用例集合TF,程序点p上的条件判定谓词表达式e,如果
Figure BDA0001805577000000111
and
Figure BDA0001805577000000112
则e为永真谓词。如果
Figure BDA0001805577000000113
and
Figure BDA0001805577000000114
则e为永假谓词。
输入各个测试用例执行过程中收集的语句覆盖信息,然后分别创建成功测试用例的语句覆盖矩阵和失败测试用例的语句覆盖矩阵。扫描这两个矩阵,对于每条语句检查其成功测试用例的语句覆盖向量和失败测试用例的语句覆盖向量,将成功测试用例语句覆盖向量元素均为0,而失败测试用例覆盖向量元素不全为0的语句作为可疑语句,加入候选集合。
统计分析各个条件判定谓词的真值,将执行所有成功测试用例以及所有失败测试用例真值均为真(或均为假)的条件判定谓词识别为可疑语句,加入候选集合中。
进一步地,在获得可疑语句集合之后,所述方法还包括:
采用到达定值分析将产生不变量违背的赋值语句及其直接控制依赖语句加入所述可疑语句集合;
采用依赖分析从所述可疑语句集合中过滤掉因故障传播导致的不变量违背误检的可疑语句。
可疑语句通常存在与失败测试用例的执行路径中。为了降低不变量求解的复杂度,只分析失败用例覆盖的语句,用优选的成功测试用例集合学习生成程序不变量。
解析优选集中各个成功测试用例的执行信息,根据事先记录的变量和表达式信息,统计生成三种类型的不变量。
(1)对于集合型不变量,则根据语句位置和对应的变量值,用并集的形式将变量的离散取值加入不变量集合中。
(2)对于浮点型范围不变量,则根据语句位置和对应的变量值,更新相应位置的变量值范围。
(3)对于真值表型不变量,则根据语句位置,采用并集的形式,把逻辑表达式对应的真值序列加入到不变量集合中。
解析各失败测试用例的执行信息文件(格式同成功测试用例),根据各个位置处的变量和表达式对应的不变量类型,判定其值是否满足之前用优选的成功测试用例集学习获得的程序不变量。
(1)对于集合型变量,则根据语句位置和变量ID,判定其值是否出现在数值型集合不变量中。
(2)对于浮点型变量,则根据语句位置和变量ID,判定其值是否满足在数值型范围不变量的上下界之内。
(3)对于逻辑型表达式,则根据语句位置,判定其真值序列是否出现在对应的逻辑表达式真值表中。
对于以上判定,如果结果为否,则称变量或表达式所在的代码行产生不变量违背,该代码行称为可疑代码行。
进一步地,所述采用到达定值分析将产生不变量违背的赋值语句及其直接控制依赖语句加入所述可疑语句集合,包括:
解析所述目标软件,创建所述目标软件的控制流图;
遍历所述控制流图,采用迭代算法利用数据流方程求解到达定值信息;
根据所述到达定值信息确定所述可疑语句集合中的产生各个不变量违背语句的赋值语句及其直接控制依赖语句;
将所述产生各个不变量违背语句的赋值语句及其直接控制依赖语句加入所述可疑语句集合。
错误状态会沿着失败执行路径传播,本发明实施例通过分析语句间的数据依赖和控制依赖关系,分析语句之间的相互影响及故障的传播路径,用以提高定位的有效性。一方面,利用变量定值关系分析,定位难于被已有方法定位到的变量赋值类缺陷。另一方面,错误状态传播会导致大量的不是失败根源的语句被识别为可疑语句,因此利用依赖分析过滤掉此类误检。
为了定量计算语句的可疑度,为不变量违背定义了置信度,用于衡量不变量违背是失败根源的可能性。
形如var=1这样的常量赋值语句在成功测试用例中和失败测试用例中变量的值都是固定的常量值,因此在该语句处无法检测到不变量违背;并且通常成功用例和失败用例均执行这种赋值语句,因此也难于被程序谱等方法有效定位。
然而如果var=1对var定值错误(例如,var正确的值应该是0),则其后继引用var的语句都会受其影响,在该后继语句处可能检测到不变量违背。
为了有效定位失败的产生根源,避免漏检这种常量赋值错误,在检测到产生不变量违背的可疑语句后,采用到达-定值分析,将该语句中变量的定值语句(赋值或return语句),也认为是可疑语句,从而将该语句的不变量违背属性设置为真,将其为失败的产生原因的置信度定义为1。
到达定值分析(Reaching Definitions):针对每一个程序点,分析程序中哪些变量的哪些定值可能通过某一程序路径到达该程序点。遍历控制流图,采用迭代算法利用数据流方程求解到达定值信息。
控制依赖:如果节点vj是否执行由节点vi的谓词决定,则称vj控制依赖于vi,或vi和vj之间存在一条控制依赖边,记为
Figure BDA0001805577000000142
定值:vi定值变量x是指由于vi的执行使得x的内存单元被重写了一次。记为
Figure BDA0001805577000000141
变量x的定值是一个语句,它赋值或可能赋值给x。最普通的定值是对x的赋值或读值到x中的语句。
引用:如果vj的表达式中使用了vi定值的变量x作为操作数,则称vj引用了vi定值的变量x。
到达:变量x的定值vi到达vj,当且仅当存在一条从vi到vj的执行路径,且变量x没有在该路径中被重新定值。
为了降低分析的复杂度并且避免引入冗余信息,本发明实施例采用1步反向控制依赖和到达定值分析。只将产生不变量违背的直接控制依赖语句和其定值语句加入到候选集合中。
可选地,所述采用依赖分析从所述可疑语句集合中过滤掉因故障传播导致的不变量违背误检的可疑语句,包括:
解析所述目标软件,获得所述目标软件的数据依赖图;
在所述数据依赖图中标记各个失败测试用例的语句节点的不变量违背信息;
根据所述不变量违背信息从所述可疑语句集合中过滤掉因故障传播导致的不变量违背检测确定的可疑语句。
一条语句的错误可能会影响到程序状态,而随着程序的继续执行,被影响的程序状态可能会被进一步传播。也就是说,程序的执行路径发生变化的位置,并不一定是真正导致错误的语句,而可能是其它语句的错误,通过程序状态不断传播,直到导致程序的执行路径发生改变。
如果一条缺陷语句是导致失败的根源,则引用该语句生成的错误值的其它语句也可能产生不变量违背。基于该启发信息,提出基于反向切片的故障传播分析方法,分析错误状态的传播路径,过滤掉因故障传播导致的不变量违背误检。在数据依赖图的基础上定义了带不变量标记的数据依赖路径和错误传播数据流路径。
为了降低复杂度,不创建完整的动态程序依赖图,而采用在静态数据依赖图的基础上按需查询的方式,分析不变量违背之间的数据依赖关系。
数据依赖图:程序P的数据依赖图DDG=(V,E)是一个有向图。其中,V是节点集合,表示程序中的语句和谓词;
Figure BDA0001805577000000151
是边集合,表示节点间的数据依赖关系。
数据依赖:如果有一条从节点v1到达节点v2的路径,且存在一个在v2中定值并在v1中引用的变量,且该变量在从v1到v2的路径上其它任何地方没有被重新定值,则称v2数据依赖于v1,或v1和v2之间存在一条数据流边,记为
Figure BDA0001805577000000152
带不变量标记的数据依赖路径:给定执行失败测试用例tf的带不变量标记的数据依赖路径,是一个有向图其中IDDG(tf)=(V,I,E),V是节点集合,表示程序中的语句和谓词;I是节点的属性集合,用于记录执行tf时,各个节点的覆盖和不变量信息;
Figure BDA0001805577000000153
是边集合,表示节点间的数据依赖关系。
其中每个节点的属性是个三元组(COV,INV,VIO),定义如下:
失败执行覆盖的语句节点:如果失败测试用例执行了该语句则其COV属性=T,否则COV属性=F;
成功用例学习了不变量的节点:如果用成功用例学习了不变量INV属性=T,否则INV属性=F;
产生不变量违背的节点:如果产生不变量违背VIO属性=T,否则VIO属性=F。
错误传播数据流路径:对于失败测试用例tf,假设
Figure BDA0001805577000000154
是IDDG中的数据流路径,如果(1)vi.COV=T1≤vi≤k,即路径上的节点vi均被失败测试用例tf执行;(2)v1.INV=T,vk.INV=T,即v1和vk均产生不变量违背;(3)k=1或者
Figure BDA0001805577000000155
2<i<k,vi.INV=T并且vi.VIO=F,即数据流路径上不包含任何未产生违背的成功不变量的节点,则
Figure BDA0001805577000000161
是一条错误传播数据流路径。
为了有效评价不变量违背是否是失败的产生原因,为每个不变量违背赋以置信度值.各个节点为失败的产生原因的置信度定义如下:
confidence(v1,tf,TS)=1
confidence(vi,tf,TS)=0.1,2≤i≤k
即v1具有较高的置信度是故障产生原因,而该数据流路径上其它位置的不变量违背有较大的可能是由于错误状态沿数据流传播导致的,因此是缺陷的置信度较低,将其赋予较低的置信度有助于降低不变量违背检测的误检。
Figure BDA0001805577000000162
是一条故障传播数据流路径,其中s1是失败根源其置信度为1,而s2、s7是因错误状态沿数据流传播置而导致不变量违背,其信度为0.1。
如果
Figure BDA0001805577000000163
的数据流路径上,
Figure BDA0001805577000000164
1<i<k vi.INV=T并且vi.VIO=F,即存在未产生违背的成功不变量的节点,则confidence(vi+1,tf,TS)=1。这是基于信任成功不变量的原则,如果一条语句包含成功不变量,则假设它不会产生错误的值,因此依赖于该语句的后继语句如果产生不变量违背,则可能是一个独立的错误来源。
Figure BDA0001805577000000165
当分析不同的失败测试用例产生的不变量违背时,不需重复创建数据依赖图和标记成功用例学习的不变量信息,只需根据新的失败测试用例产生的不变量违背信息,重新执行第(3)步。
提出考虑失败路径的测试用例优选方法,为了减少多种失败间的相互干扰,首先根据执行路径相似度聚类失败测试用例,把可能由相同原因导致的失败测试用例聚在同一个类中,然后针对各个失败用例聚类分别选择成功测试用例,选择和失败用例执行路径相似的测试用例集、且避免选择巧合正确的测试用例,从而缩窄不变量范围,以降低漏检。利用程序依赖分析降低故障定位的漏检和误检。一方面,利用到达定值分析识别变量的定值语句,识别赋值语句缺陷,降低漏检;另一方面基于依赖的错误传播分析方法,利用动态跟踪信息,分析错误的传播路径,进而过滤掉由错误传播导致的不变量违背的误检。
优选地,在获得可疑语句集合之后,所述方法还包括:
统计分析各个失败测试用例产生的不变量违背,计算所述可疑语句集合中各个可疑语句的可疑度,并根据所述各个可疑语句的可疑度对所述各个可疑语句进行排序。
可选地,所述计算所述可疑语句集合中各个可疑语句的可疑度,包括:
根据如下公式计算可疑语句集合中各个可疑语句的可疑度:
Figure BDA0001805577000000171
其中,Sus_Inv(si)是可疑语句si的可疑度;TS为所述预设的成功测试用例集合,|TF|为所述预设的失败测试用例集合中测试用例的总数;vi是数据依赖图中的第i个节点,tf为失败测试用例,confidence(vi,tf,TS)为vi节点执行失败测试用例tf产生不变量违背的置信度;如果vi是依赖分析中判定的失效产生原因,则confidence(v1,tf,TS)=1,否则confidence(vi,tf,TS)=0.1,2≤i≤k。
本发明实施例将可疑语句排序,提高了检测效率。
如图2所示,本发明实施例的基于程序不变量的软件故障定位方法主要步骤如下:
第一步,解析源代码,并收集执行信息。
为了获取程序的执行信息,在抽象语法树的基础上插桩程序。在保证原程序的逻辑和功能不变的基础上,分三种粒度插桩探针语句,分别用于后续在程序执行过程中获得语句覆盖、变量表达式值、逻辑表达式真值表信息。
第二步,识别两类难于用不变量违背定位的可疑语句。
解析语句覆盖信息,识别仅被失败覆盖的语句;解析和逻辑表达式真值表和检测永真/永假谓词。
第三步,和失败测试用例无关的成功用例,会对不变量定位违背检测产生干扰。例如,如果成功的测试用例较多,在缺陷程序语句处,则可能导致学习获得不变量范围过于宽泛,导致不变量违背检测的漏检。而在其它正确语句处,则可能学习获得和当前失败无关的不变量,导致不变量违背检测的误检。
另外,成功测试用例集中还可能存在巧合正确的测试用例。巧合正确的测试用例在程序的执行过程中可能产生了错误的状态,但是没有被传播到最后的结果,因此如果用于学习生成不变量,可能导致生成错误的不变量集合,进而影响后续定位过程,既可能导致不变量违背检测的误检也可能导致漏检。
因此,本发明实施例提出考虑失败路径的测试用例优选方法。首先根据执行语句覆盖信息,聚类具有相似执行路径的失败测试用例,避免多种不同失败之间的相互干扰。然后为各个失败用例聚类,删除巧合正确的测试用例,优先选择和失败执行路径相似的成功测试用例。
第四步,利用优选的成功测试用例学习不变量集合。本发明实施例在降低故障定位的复杂度的同时提高有效性,根据各程序表达式的类型,定义了三种类型的不变量,不但支持定位和值相关的缺陷,还支持定位和程序逻辑相关的缺陷。
第五步,检测不变量违背。
针对学习得到的不变量集合,检测失败测试用例在对应的程序点处的值是否满足不变量,如果不满足,则将不变量违背加入候选集合中,该程序点标记为可疑语句位置。
第六步,利用故障传播分析降低不变量违背检测的漏检和误检。
赋值语句常量变异类的缺陷很难定位到,因为这种语句在执行时的值和执行路径对于成功和失败测试用例是不变的。然而,由于错误的程序状态会在失败测试用例执行过程中沿着程序的控制和数据依赖路径传播,和该赋值语句存在依赖关系的后续语句在执行失败用例时可能会展示出不变量违背行为,通过到达定值分析,进一步识别赋值语句缺陷,降低漏检。
另一方面错误状态传播会导致不变量违背检测生成误检。如果一条缺陷语句是导致失败的根源,则引用该语句生成的错误值的其它语句也可能产生不变量违背。这种后续的不变量违背不是失败的根源,它们仅仅是因为错误的值通过后续的计算传播而导致的。基于该启发信息,分析错误的传播路径,进而过滤掉由故障传播导致的不变量违背的误检。
第七步,统计计算发生不变量违背的程序点的可疑度,并按可疑度从高到低的顺序进行排序,输出可疑语句列表及其不变量违背信息。
图3为本发明一个实施例的基于程序不变量的软件故障定位装置的结构示意图。该实施例的装置包括:
源代码插桩单元31,用于针对目标软件的源代码建立抽象语法树,根据所述抽象语法树对所述目标软件的源代码进行语句级别的插桩、值级别的插桩和逻辑表达式级别的插桩,采用预设的成功测试用例集合和预设的失败测试用例集合执行插桩后的所述目标软件的源代码,获得各个测试用例的执行信息,包括:获得语句覆盖信息、变量和表达式的值和逻辑表达式真值表;
测试用例集合处理单元32,用于对所述失败测试用例集合进行聚类分析,根据失败覆盖等价划分优先选择准则对所述成功测试用例集合进行筛选,获得优选成功测试用例集合;
不变量集合获取单元33,用于学习所述优选成功测试用例集合,获得程序不变量集合,所述程序不变量集合中包括集合型不变量、浮点型范围不变量和真值表型不变量;
可疑语句集合获取单元34,根据所述失败测试用例集合的执行信息和所述程序不变量集合进行不变量违背检测,获得可疑语句集合。
可选地,测试用例集合处理单元32还用于:
将必然巧合测试用例从所述成功测试用例中剔除。
可选地,可疑语句集合获取单元34还用于:
根据预设的成功测试用例集合的语句覆盖信息和失败测试用例集合的语句覆盖信息获得仅被失败测试用例覆盖的语句,将所述仅被失败测试用例覆盖的语句加入所述可疑语句集合;
根据所述预设的成功测试用例集合的逻辑表达式真值表和失败测试用例集合的逻辑表达式真值表获得永真和/或永假谓词,将所述永真和/或永假谓词所在的语句加入所述可疑语句集合。
可选地,还包括:
故障传播分析单元,用于采用到达定值分析将产生不变量违背的赋值语句及其直接控制依赖语句加入所述可疑语句集合,采用依赖分析从所述可疑语句集合中过滤掉因故障传播导致的不变量违背误检。
故障传播分析单元具体用于:
解析所述目标软件,获得所述目标软件的数据依赖图;
在所述数据依赖图中标记各个失败测试用例的语句节点的不变量违背信息;
根据所述不变量违背信息从所述可疑语句集合中过滤掉因故障传播导致的不变量违背检测确定的可疑语句。
可选地,故障传播分析单元还用于:
解析所述目标软件,创建所述目标软件的控制流图;
遍历所述控制流图,采用迭代算法利用数据流方程求解到达定值信息;
根据所述到达定值信息确定所述可疑语句集合中的产生各个不变量违背语句的赋值语句及其直接控制依赖语句;
将所述产生各个不变量违背语句的赋值语句及其直接控制依赖语句加入所述可疑语句集合。
可选地,还包括语句可疑度计算单元,用于统计分析各个失败测试用例产生的不变量违背,计算所述可疑语句集合中各个可疑语句的可疑度,并根据所述各个可疑语句的可疑度对所述各个可疑语句进行排序。
语句可疑度计算单元36具体用于:
统计分析各个失败测试用例产生的不变量违背,计算所述可疑语句集合中各个可疑语句的可疑度,并根据所述各个可疑语句的可疑度对所述各个可疑语句进行排序。
该可疑度计算单元具体用于:
根据如下公式计算可疑语句集合中各个可疑语句的可疑度:
Figure BDA0001805577000000211
其中,Sus_Inv(si)是可疑语句si的可疑度;TS为所述预设的成功测试用例集合,|TF|为所述预设的失败测试用例集合中测试用例的总数;vi是数据依赖图中的第i个节点,tf为失败测试用例,confidence(vi,tf,TS)为vi节点执行失败测试用例tf产生不变量违背的置信度;如果vi是依赖分析中判定的失效产生原因,则confidence(v1,tf,TS)=1,否则confidence(vi,tf,TS)=0.1,2≤i≤k。
本发明实施例的装置可以用于执行上述方法实施例,其原理和技术效果类似,此处不再赘述。
图4为本发明一个实施例的电子设备的结构示意图。如图4所示,该电子设备包括存储器41和处理器42,存储器41和处理器42之间通过内部总线43通讯连接,存储器41存储有能够被处理器42执行的程序指令,程序指令被处理器42执行时能够实现上述的方法。
此外,上述的存储器41中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本发明的另一个实施例提供一种计算机可读存储介质,计算机可读存储介质存储计算机指令,计算机指令使所述计算机执行上述的方法。
针对已有方法存在对不变量定义不完善导致定位的缺陷种类有限、因缺少测试用例影响的分析以及对错误传播的分析导致不变量违背检测的漏检和误检等问题进行研究。首先,本发明改进了程序不变量的定义,根据变量和表达式类型,将不变量划分为范围不变量、集合不变量、布尔序列不变量;并定义了两类难于用不变量违背检测的可疑语句;从而丰富了可以定位的缺陷种类。然后研究降低不变量违背检测误报和漏报的优化策略。提出考虑失败路径的测试用例优选,对失败测试用例按执行路径聚类,以避免多种失败间的相互干扰,并选择和失败用例执行路径相似的测试用例集、且避免选择巧合正确的测试用例,从而缩窄不变量范围,以降低漏检。对失败测试用例按执行路径聚类,避免多种失败间的相互干扰。提出利用故障传播分析降低不变量违背检测的漏检和误检的方法,一方面,利用到达定值分析检测漏检的赋值语句缺陷;另一方面分析错误的传播路径,进而过滤掉由错误传播导致的不变量违背的误检。在以上研究基础上,提出解析错误状态传播的程序不变量故障定位方法。
与程序谱方法相比,本发明实施例方法的优势:
(1)由于本发明实施例方法的可疑语句列表只列出产生不变量违背的可疑语句,且通过测试用例优选、错误传播等操作进一步降低误检,因此审查较少的代码就可以定位到大多数缺陷版本。
(2)对于可以定位到的版本而言,本发明实施例方法具有较低的代码审查开销。
程序谱方法更适合于定位失败路径和成功路径覆盖语句存在明显差异的缺陷,例如控制流相关的缺陷。而当成功和失败用例都执行缺陷语句时,则定位效果较差。
本发明实施例方法不仅考虑语句覆盖(如检测仅被失败测试用例覆盖的可疑语句),还分析错误的状态值沿着程序的控制流和数据流的传播,因此显著提高了定位结果的有效性。
(3)程序谱方法不考虑语句之间的相互影响,只能给出统计分析结果,无法有效辅助开发人员理解缺陷。不变量分析考虑了故障传播和程序的上下文,且不变量违背结果可以用以辅助开发人员理解软件错误的产生原因,为其修正缺陷提供辅助。
(4)和程序谱方法相比,本发明实施例方法由于考虑具体的变量值以及错误传播路径,因此显著降低了并列排名的语句,提高定位的有效性。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
需要说明的是术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本发明的说明书中,说明了大量具体细节。然而能够理解的是,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。类似地,应当理解,为了精简本发明公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释呈反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
以上所述,仅为本发明的具体实施方式,在本发明的上述教导下,本领域技术人员可以在上述实施例的基础上进行其他的改进或变形。本领域技术人员应该明白,上述的具体描述只是更好的解释本发明的目的,本发明的保护范围应以权利要求的保护范围为准。

Claims (10)

1.一种基于程序不变量的软件故障定位方法,其特征在于,包括:
针对目标软件的源代码建立抽象语法树,根据所述抽象语法树对所述目标软件的源代码进行语句级别的插桩、值级别的插桩和逻辑表达式级别的插桩,采用预设的成功测试用例集合和预设的失败测试用例集合执行插桩后的所述目标软件的源代码,获得各个测试用例的执行信息,包括:语句覆盖信息、变量和表达式的值和逻辑表达式真值表;
对所述预设失败测试用例集合进行聚类分析,根据失败覆盖等价划分优先选择准则对预设成功测试用例集合进行筛选,获得优选成功测试用例集合;
学习所述优选成功测试用例集合的执行信息,获得程序不变量集合,所述程序不变量集合中包括集合型不变量、浮点型范围不变量和真值表型不变量;
根据所述失败测试用例集合的执行信息和所述程序不变量集合进行不变量违背检测,获得可疑语句集合。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
根据预设的成功测试用例集合的语句覆盖信息和失败测试用例集合的语句覆盖信息获得仅被失败测试用例覆盖的语句,将所述仅被失败测试用例覆盖的语句加入所述可疑语句集合;
根据所述预设的成功测试用例集合的逻辑表达式真值表和失败测试用例集合的逻辑表达式真值表获得永真和/或永假谓词,将所述永真和/或永假谓词所在的语句加入所述可疑语句集合。
3.根据权利要求1所述的方法,其特征在于,在获得可疑语句集合之后,所述方法还包括:
采用到达定值分析将产生不变量违背的赋值语句及其直接控制依赖语句加入所述可疑语句集合;
采用依赖分析从所述可疑语句集合中过滤掉因故障传播导致的不变量违背误检的可疑语句。
4.根据权利要求3所述的方法,其特征在于,所述采用到达定值分析将产生不变量违背的赋值语句及其直接控制依赖语句加入所述可疑语句集合,包括:
解析所述目标软件,创建所述目标软件的控制流图;
遍历所述控制流图,采用迭代算法利用数据流方程求解到达定值信息;
根据所述到达定值信息确定所述可疑语句集合中的产生各个不变量违背语句的赋值语句及其直接控制依赖语句;
将所述产生各个不变量违背语句的赋值语句及其直接控制依赖语句加入所述可疑语句集合。
5.根据权利要求3所述的方法,其特征在于,所述采用依赖分析从所述可疑语句集合中过滤掉因故障传播导致的不变量违背误检的可疑语句,包括:
解析所述目标软件,获得所述目标软件的数据依赖图;
在所述数据依赖图中标记各个失败测试用例的语句节点的不变量违背信息;
根据所述不变量违背信息从所述可疑语句集合中过滤掉因故障传播导致的不变量违背检测确定的可疑语句。
6.根据权利要求1所述的方法,其特征在于,在获得可疑语句集合之后,所述方法还包括:
统计分析各个失败测试用例产生的不变量违背,计算所述可疑语句集合中各个可疑语句的可疑度,并根据所述各个可疑语句的可疑度对所述各个可疑语句进行排序。
7.根据权利要求6所述的方法,其特征在于,所述计算所述可疑语句集合中各个可疑语句的可疑度,包括:
根据如下公式计算可疑语句集合中各个可疑语句的可疑度:
Figure FDA0001805576990000021
其中,Sus_Inv(si)是可疑语句si的可疑度;TS为所述预设的成功测试用例集合,|TF|为所述预设的失败测试用例集合中测试用例的总数;vi是数据依赖图中的第i个节点,tf为失败测试用例,confidence(vi,tf,TS)为vi节点执行失败测试用例tf产生不变量违背的置信度;如果vi是依赖分析中判定的失效产生原因,则confidence(v1,tf,TS)=1,否则confidence(vi,tf,TS)=0.1,2≤i≤k。
8.一种基于程序不变量的软件故障定位装置,其特征在于,包括:
源代码插桩单元,用于针对目标软件的源代码建立抽象语法树,根据所述抽象语法树对所述目标软件的源代码进行语句级别的插桩、值级别的插桩和逻辑表达式级别的插桩,采用预设的成功测试用例集合和预设的失败测试用例集合执行插桩后的所述目标软件的源代码,获得各个测试用例的执行信息,包括:获得语句覆盖信息、变量和表达式的值和逻辑表达式真值表;
测试用例集合处理单元,用于对所述失败测试用例集合进行聚类分析,根据失败覆盖等价划分优先选择准则对所述成功测试用例集合进行筛选,获得优选成功测试用例集合;
不变量集合获取单元,用于学习所述优选成功测试用例集合,获得程序不变量集合,所述程序不变量集合中包括集合型不变量、浮点型范围不变量和真值表型不变量;
可疑语句集合获取单元,根据所述失败测试用例集合的执行信息和所述程序不变量集合进行不变量违背检测,获得可疑语句集合。
9.一种电子设备,其特征在于,所述电子设备包括存储器和处理器,所述存储器和所述处理器之间通过内部总线通讯连接,所述存储器存储有能够被所述处理器执行的程序指令,所述程序指令被所述处理器执行时能够实现权利要求1-7任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储计算机指令,所述计算机指令使计算机执行权利要求1-7任一项所述的方法。
CN201811096080.XA 2018-09-19 2018-09-19 一种基于程序不变量的软件故障定位方法及装置 Active CN109144882B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811096080.XA CN109144882B (zh) 2018-09-19 2018-09-19 一种基于程序不变量的软件故障定位方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811096080.XA CN109144882B (zh) 2018-09-19 2018-09-19 一种基于程序不变量的软件故障定位方法及装置

Publications (2)

Publication Number Publication Date
CN109144882A CN109144882A (zh) 2019-01-04
CN109144882B true CN109144882B (zh) 2021-07-06

Family

ID=64814976

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811096080.XA Active CN109144882B (zh) 2018-09-19 2018-09-19 一种基于程序不变量的软件故障定位方法及装置

Country Status (1)

Country Link
CN (1) CN109144882B (zh)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110109661A (zh) * 2019-05-09 2019-08-09 深圳美美网络科技有限公司 一种业务逻辑的开发方法及开发***
CN110825650B (zh) * 2019-11-29 2023-04-11 北京网聘咨询有限公司 单元测试覆盖精度检测方法及装置
CN113127334A (zh) * 2020-01-15 2021-07-16 阿里巴巴集团控股有限公司 数据处理方法、装置、电子设备和存储设备
CN111308935B (zh) * 2020-02-27 2021-01-29 北京广利核***工程有限公司 一种优先级管理产品自动测试装置及方法
CN111563044B (zh) * 2020-05-11 2022-10-25 西安邮电大学 一种基于程序变异的程序谱错误定位方法
CN111831556A (zh) * 2020-06-18 2020-10-27 中国科学院空间应用工程与技术中心 软件多故障解耦及并行定位方法及装置
CN111931181B (zh) * 2020-07-07 2022-09-09 北京理工大学 基于图挖掘的软件逻辑漏洞检测方法
CN112965894B (zh) * 2021-02-04 2023-07-07 重庆大学 一种基于上下文感知的缺陷定位方法
CN113010890B (zh) * 2021-02-26 2023-02-07 中科天齐(山西)软件安全技术研究院有限公司 一种应用程序安全检测方法、装置、电子设备和存储介质
CN113064824B (zh) * 2021-03-31 2022-12-02 重庆紫光华山智安科技有限公司 结果分析方法和装置、电子设备及存储介质
CN113434385A (zh) * 2021-05-26 2021-09-24 华东师范大学 一种针对软件模型检查工具的测试用例自动生成方法和***
CN113392000B (zh) * 2021-06-10 2024-01-30 卫宁健康科技集团股份有限公司 测试用例执行结果分析方法、装置、设备及存储介质
CN114741302B (zh) * 2022-04-19 2022-12-06 杭州金衡和信息科技有限公司 一种基于变量分离的软件bug定位方法及装置
CN115098292B (zh) * 2022-07-05 2023-12-08 中国电信股份有限公司 应用程序崩溃根原因识别方法、装置及电子设备
CN115617701B (zh) * 2022-12-20 2023-03-10 北京航空航天大学 一种测试预言预测方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106339288A (zh) * 2016-06-06 2017-01-18 西北工业大学 一种软件故障上下文定位的方法及装置
CN108415848A (zh) * 2018-05-14 2018-08-17 河南工业大学 一种软件错误定位方法及装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8869125B2 (en) * 2011-12-27 2014-10-21 Infosys Limited Systems and methods for demarcating information related to one or more blocks in an application
US10296447B2 (en) * 2016-12-09 2019-05-21 Fujitsu Limited Automated software program repair

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106339288A (zh) * 2016-06-06 2017-01-18 西北工业大学 一种软件故障上下文定位的方法及装置
CN108415848A (zh) * 2018-05-14 2018-08-17 河南工业大学 一种软件错误定位方法及装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Simultaneous Localization of Software Faults;Abubakar Zakari 等;《 IEEE Access》;20180423;第23990-24002页 *
软件错误自动定位关键科学问题及研究进展;王克朝 等;《计算机学报》;20151115;第38卷(第11期);第2262-2278页 *

Also Published As

Publication number Publication date
CN109144882A (zh) 2019-01-04

Similar Documents

Publication Publication Date Title
CN109144882B (zh) 一种基于程序不变量的软件故障定位方法及装置
US9983984B2 (en) Automated modularization of graphical user interface test cases
CN111459799B (zh) 一种基于Github的软件缺陷检测模型建立、检测方法及***
Rattan et al. Software clone detection: A systematic review
US8312440B2 (en) Method, computer program product, and hardware product for providing program individuality analysis for source code programs
CN111104335B (zh) 一种基于多层次分析的c语言缺陷检测方法及装置
Chen et al. Coverage prediction for accelerating compiler testing
US20160342720A1 (en) Method, system, and computer program for identifying design revisions in hardware design debugging
CN111400724A (zh) 基于代码相似性分析的操作***脆弱性检测方法、***及介质
EP3674918A2 (en) Column lineage and metadata propagation
Dou et al. CACheck: detecting and repairing cell arrays in spreadsheets
CN103914379B (zh) 故障自动注入与故障检测的方法及其***
JP7404839B2 (ja) ソフトウェアプログラム不良位置の識別
Strüder et al. Feature-oriented defect prediction
Marques-Silva et al. Reasoning about inconsistent formulas
Fry et al. Clustering static analysis defect reports to reduce maintenance costs
CN113157565A (zh) 一种基于种子用例突变的反馈式js引擎模糊测试方法及装置
CN116578980A (zh) 基于神经网络的代码分析方法及其装置、电子设备
JP7384054B2 (ja) 自動化されたソフトウェアプログラム修復
CN115422092B (zh) 一种基于多方法融合的软件bug定位方法
CN111966578A (zh) 一种安卓兼容性缺陷修复效果的自动化评估方法
CN109032946B (zh) 一种测试方法和装置、计算机可读存储介质
Quach et al. Evaluating the impact of falsely detected performance bug-inducing changes in JIT models
Kim et al. Automated bug neighborhood analysis for identifying incomplete bug fixes
Salman Test case generation from specifications using natural language processing

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