一种程序中基于动态符号执行的自动错误定位方法.pdf

上传人:b*** 文档编号:24114 上传时间:2018-01-12 格式:PDF 页数:10 大小:904.75KB
返回 下载 相关 举报
摘要
申请专利号:

CN201510132968.4

申请日:

2015.03.25

公开号:

CN104750608A

公开日:

2015.07.01

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 11/36申请日:20150325|||公开

IPC分类号:

G06F11/36

主分类号:

G06F11/36

申请人:

南京大学

发明人:

马晓星; 许畅; 吕建; 金昊

地址:

210046江苏省南京市栖霞区仙林大道163号

优先权:

专利代理机构:

南京钟山专利代理有限公司32252

代理人:

戴朝荣

PDF下载: PDF下载
内容摘要

本发明公开了一种程序中基于动态符号执行的自动错误定位方法,包括蜕变模型构造、测试引擎、自动错误定位引擎和错误定位结果整合;蜕变模型构造利用蜕变关系将没有Oracle的程序构造出有Oracle的程序,通过测试引擎进行测试,找到多个导致错误的输入,进而自动错误定位引擎利用动态符号执行技术,从这多个错误输入出发,分别通过分支倒转技术定位出原程序中的可能错误点,最后错误定位结果整合模块将多个定位结果利用投票算法进行整合,得到最后的错误点,并将其与相应的错误执行路径一起报告给用户;本发明针对没有Oracle的程序进行自动错误定位,仅用户根据蜕变关系在预定义的框架内填充少量代码构造蜕变模型程序,过程高度自动化、人工干预少、使用方便。

权利要求书

1.  一种程序中基于动态符号执行的自动错误定位方法,其特征在于,具体步骤包括:
步骤一、针对原程序中蕴含的蜕变关系,为原程序构造蜕变模型,使得原程序转变为含有Oracle的程序;
步骤二、构建测试引擎,随机生成输入并执行步骤一中构造的每一个蜕变模型,为每一个蜕变模型找到导致蜕变模型产生错误的输入;
步骤三、构建自动错误定位引擎,针对每一个蜕变模型,启动动态符号执行,定位出原程序代码中的错误行;
步骤四、对步骤三得到的代码中的错误行进行错误定位结果整合,采用投票机制得到最终的错误定位结果。

2.
  如权利要求1所述的一种程序中基于动态符号执行的自动错误定位方法,其特征在于,步骤一中,所述构造蜕变模型的具体流程包括:
预定义蜕变模型的程序框架并内置输入转换规则与蜕变关系检查规则,用户在所述程序框架内选择内置输入转换规则进行输入转换;
选择蜕变关系检查规则进行蜕变关系检查;
或者根据需要重写、扩展输入转换规则和蜕变关系检查规则,从而构造出有Oracle的程序。

3.
  如权利要求2所述的一种程序中基于动态符号执行的自动错误定位方法,其特征在于,步骤二中,所述执行蜕变模型的具体流程包括:
读取原程序的输入,根据蜕变关系将原输入转换成蜕变后输入;
以原输入执行原程序得到原输出,以蜕变后输入执行原程序得到转换后的输出;
检查原输出与转换后的输出是否违反蜕变关系,进而判断原程序中是否存在错误。

4.
  如权利要求1所述的一种程序中基于动态符号执行的自动错误定位方法,其特征在于,所述步骤三的具体过程包括:
以步骤二中生成的错误输入为初始输入执行蜕变模型,并搜集此次执行的路径约束条件;
通过依次倒转路径条件分支生成新的输入;
以新的输入再次执行蜕变模型,直到新生成的输入让蜕变模型执行正确;
发现蜕变模型执行正确之后,将最后倒转的分支条件所对应的原程序代码行作为错误点。

5.
  如权利要求1所述的一种程序中基于动态符号执行的自动错误定位方法,其特征在于,步骤四中,所述错误定位结果整合具体为:针对同一个原程序的不同蜕变模型以及同一个蜕变模型的不同错误输入得到的定位结果,采用投票机制进行投票,选出出现次数最多的代码行作为最终的错误点报告给用户。

6.
  如权利要求2所述的一种程序中基于动态符号执行的自动错误定位方法,其特征在于:
所述蜕变模型按照蜕变关系的约束封装了输入转换,并且用原输入以及转换后的输入依次执行原程序得到相应输出,最后检查得到的输出是否满足蜕变关系的约束;
蜕变模型在原程序基础之上构造一个新程序,读取与原程序一致的输入,判断输出通过或者不通过:
当输出不通过时表明原程序存在错误,蜕变模型起到Oracle的作用,将检查结果呈现给用户。

7.
  如权利要求1所述的一种程序中基于动态符号执行的自动错误定位方法,其特征在于,步骤二中:
所述错误输入的数目由用户根据需要配置;
测试引擎设定测试执行次数上限,在达到测试执行次数上限时,如果仍未能找到错误的输入,则停止测试,并标记这个蜕变模型的错误无法被检测。

8.
  如权利要求1所述的一种程序中基于动态符号执行的自动错误定位方法,其特征在于,步骤三中:
所述自动错误定位引擎基于Java Pathfinder平台设计,通过扩展Symbolic Pathfinder对程序进行动态符号执行,实现了系统分支倒转方法,完成对程序的错误定位;
所述自动错误定位引擎在分支倒转过程中使用Choco与CVC3作为约束求解器求解新生成的路径条件。

说明书

一种程序中基于动态符号执行的自动错误定位方法
技术领域
本发明公开了一种程序中基于动态符号执行的自动错误定位方法,涉及自动软件测试与自动软件缺陷定位技术,属于软件工程技术领域
背景技术
自动软件错误定位对于保证软件质量来说至关重要,但一直以来自动软件错误定位都是一个非常困难的任务。对存在Oracle问题的程序进行自动错误定位就更困难了。而如今随着软件行业的发展,越来越多像机器学习,科学计算,编译器等领域的程序中存在Oracle问题,这些都给自动错误定位带来了非常大的挑战。而此类软件的质量保证同样非常重要,从而需要一种技术来对此类程序进行自动错误定位。
目前传统的自动软件错误定位技术大多需要利用程序的Oracle。其中一类技术利用正确的测试执行路径与错误的测试执行路径,利用复杂的程序分析技术找到软件中的可疑代码片段报告给开发者。另一类基于统计的错误定位技术搜集大量的正确和错误的执行路径,借助统计技术计算每一个软件中的实体单元(代码行、方法)与程序错误的关联程度,并以此为依据为每一个软件实体单元进行打分并根据打分并根据打分对所有软件实体单元进行排序,将得分最高软件实体单元报告给开发者。然而在没有Oracle的程序中,软件的一次执行是正确还是错误是无法判断的,所以传统的软件错误定位技术往往无法定位这类程序中的错误。针对测试没有Oracle的程序,蜕变测试利用挖掘软件中存在的蜕变关系测试程序,但是无法定位软件中存在的错误。另外,还有一些技术将蜕变测试与基于统计的错误定位相结合找到没有Oracle的软件中的可疑代码片段,但此类方法需要大量的通过和违反蜕变关系的测试用例,而往往这些测试用例非常难以获得。这些都给自动定位没有Oracle的软件中的错误带来了巨大困难。
发明内容
本发明所要解决的技术问题是:针对现有技术的缺陷,提供一种程序中基于动态符号执行的自动错误定位方法,针对没有Oracle的软件,进行自动错误定位。该方法利用蜕变关系为没有Oracle的原程序构造一个有Oracle的新程序,在这个构造的新程序上利用自动随机测试找到错误输入,然后通过动态符号执行 技术进行分支倒转从而自动定位软件中的错误。
本发明为解决上述技术问题采用以下技术方案:
一种程序中基于动态符号执行的自动错误定位方法,具体步骤包括:
步骤一、针对原程序中蕴含的蜕变关系,为原程序构造蜕变模型,使得原程序转变为含有Oracle的程序;
步骤二、构建测试引擎,随机生成输入并执行步骤一中构造的每一个蜕变模型,为每一个蜕变模型找到导致蜕变模型产生错误的输入;
步骤三、构建自动错误定位引擎,针对每一个蜕变模型,启动动态符号执行,定位出原程序代码中的错误行;
步骤四、对步骤三得到的代码中的错误行进行错误定位结果整合,采用投票机制得到最终的错误定位结果。
作为本发明的进一步优选方案,步骤一中,所述构造蜕变模型的具体流程包括:
预定义蜕变模型的程序框架并内置输入转换规则与蜕变关系检查规则,用户在所述程序框架内选择内置输入转换规则进行输入转换;
选择蜕变关系检查规则进行蜕变关系检查;
或者根据需要重写、扩展输入转换规则和蜕变关系检查规则,从而构造出有Oracle的程序。
作为本发明的进一步优选方案,步骤二中,所述执行蜕变模型的具体流程包括:
读取原程序的输入,根据蜕变关系将原输入转换成蜕变后输入;
以原输入执行原程序得到原输出,以蜕变后输入执行原程序得到转换后的输出;
检查原输出与转换后的输出是否违反蜕变关系,进而判断原程序中是否存在错误。
作为本发明的进一步优选方案,所述步骤三的具体过程包括:
以步骤二中生成的错误输入为初始输入执行蜕变模型,并搜集此次执行的路径约束条件;
通过依次倒转路径条件分支生成新的输入;
以新的输入再次执行蜕变模型,直到新生成的输入让蜕变模型执行正确;
发现蜕变模型执行正确之后,将最后倒转的分支条件所对应的原程序代码行作为错误点。
作为本发明的进一步优选方案,步骤四中,所述错误定位结果整合具体为:针对同一个原程序的不同蜕变模型以及同一个蜕变模型的不同错误输入得到的定位结果,采用投票机制进行投票,选出出现次数最多的代码行作为最终的错误点报告给用户。
作为本发明的进一步优选方案,所述蜕变模型按照蜕变关系的约束封装了输入转换,并且用原输入以及转换后的输入依次执行原程序得到相应输出,最后检查得到的输出是否满足蜕变关系的约束;
蜕变模型在原程序基础之上构造一个新程序,读取与原程序一致的输入,判断输出通过或者不通过:
当输出不通过时表明原程序存在错误,蜕变模型起到Oracle的作用,将检查结果呈现给用户。
作为本发明的进一步优选方案,步骤二中:
所述错误输入的数目由用户根据需要配置;
测试引擎设定测试执行次数上限,在达到测试执行次数上限时,如果仍未能找到错误的输入,则停止测试,并标记这个蜕变模型的错误无法被检测。
作为本发明的进一步优选方案,步骤三中,所述自动错误定位引擎基于JavaPathfinder平台设计,通过扩展Symbolic Pathfinder对程序进行动态符号执行,实现了系统分支倒转方法,完成对程序的错误定位;所述自动错误定位引擎在分支倒转过程中使用Choco与CVC3作为约束求解器求解新生成的路径条件。
所述自动错误定位引擎的输入是一个蜕变模型和其对应的一个错误输入,输出是原程序中的一个错误点。由于对于一个原程序有多个蜕变模型,而对于每个蜕变模型会有多个错误输入,所以自动错误定位引擎针对一个程序会得到多个错误点;所述自动错误定位引擎使用了动态符号执行技术,以错误输入为初始输入具体执行蜕变模型,同时搜集对应的执行路径条件PC,执行结束之后从路径条件PC的末尾的分支(记为cn)开始进行倒转,得到新的路径条件,然后使用约束求解器对新得到的路径条件进行可满足性判断,如果不满足则向前倒转下一个 没被倒转过的分支;如果可满足,则解出满足这个新的路径条件的输入的具体值,并用这个新的输入再次执行蜕变模型,同样在执行过程中同时搜集对应的新的路径约束PC1,如果此次执行正确,那么将cn对应的代码行作为错误点;如果此次执行错误,那么从PC1开始继续迭代上述过程搜索新输入,直到倒转某个分支ci之后生成的新输入让蜕变模型执行正确,将ci对应的代码行作为错误点;所述自动错误定位引擎将错误的执行路径(执行代码的序列)与定位的错误点同时报告给用户(开发者),更有效地帮助用户(开发者)找到原程序中错误的代码。
本发明采用以上技术方案与现有技术相比,具有以下技术效果:本发明所公开的方法只在初始阶段需要极少的人工干预,整个过程高度自动化,能够有效地定位没有Oracle的软件中的错误,为开发者调试此类程序提供重要的帮助。
附图说明
图1为本发明的方法结构图。
图2为本发明中蜕变模型构造的描述图。
图3为本发明中基于动态符号执行通过分支倒转的错误定位原理图。
图4为本发明中自动错误定位工具演示图。
具体实施方式
下面详细描述本发明的实施方式,所述实施方式的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
下面结合附图对本发明的技术方案做进一步的详细说明:
如图1所示,在本发明的一个具体实施例中,面向没有Oracle的程序,需要用户根据原程序与原程序所蕴含的蜕变关系构造出包含Oracle的新程序,将所述新程序定义为蜕变模型,这个过程只需要用户在本方法预定义好的程序框架中进行少量的代码填充即可完成。由于原程序中可能蕴含多个蜕变关系,所以可以生成多个蜕变模型。在构造好蜕变模型之后,我们得到的是含有Oracle的新程序,解决了原程序的Oracle问题。接下来测试引擎随机生成输入执行生成的蜕变模型,测试引擎将会为每个蜕变模型找到多个错误输入作为自动错误定位引擎的初始输入。如果在用户指定的测试时间(或测试用例个数)上限内没有找到 使蜕变模型错误的输入,那么测试引擎将报告没有发现错误。
在测试引擎找到错误输入之后,自动错误定位引擎将会分别从各个蜕变模型以及其对应的各个错误输入开始定位程序中的错误。自动错误定位引擎的每一次单独错误定位输入是一个蜕变模型以及其对应的错误输入对<M,If>,它以错误输入If为初始输入对蜕变模型M进行动态符号执行,通过系统地分支倒转不断为蜕变模型M生成新的输入,最终搜索到正确的输入,发现关键分支并将其对应的原程序的代码行作为错误点。由于一个原程序可以有多个蜕变模型,而测试引擎为每个蜕变模型找到多个错误输入,所以会有多个蜕变模型与其对应的错误输入对<M,If>,自动错误定位引擎将多次被调用,得到多个错误定位结果。最后错误定位结果整合模块将以投票的方式整合多个错误定位结果,将出现频率最高的错误点作为最终的错误定位结果。同时,错误执行的执行路径也会和定位的错误点一起报告给用户(开发者),帮助开发者找到程序中的错误。
在具体过程中,蜕变模型的生成是用户(开发者)在本方法预定义的蜕变模型程序框架内填充少量的代码完成的,用户可以根据需要选择内置的输入转换操作与蜕变关系检查操作,也可以根据需要进行扩展。
在具体过程中,用户(开发者)为测试引擎设定一个测试时间(或者测试用例生成数量)上限,测试引擎会不断为生成的蜕变模型随机生成输入,直到找到让蜕变模型错误的输入,如果达到了测试时间(或测试用例)上限还未发现错误输入,则报告没有发现错误;另外用户(开发者)可以配置错误输入的个数,测试引擎将会找到指定个数的错误输入。
在具体过程中,自动错误定位引擎每次用一个蜕变模型和一个其对应的错误输入作为输入启动动态符号执行,此后通过系统地分支倒转生成后续输入,直到找到正确的输入,将最后一次倒转的分支(通过倒转此分支,我们由错误的输入得到了正确的输入)所对应的代码行作为错误点。由于原程序可以有多个蜕变模型,为每个蜕变模型我们可以搜集多个错误输入,所以在错误定位的过程中会多次执行错误定位引擎。
在具体过程中,自动错误定位引擎为一个原程序会得到多个错误定位结果,错误定位结果整合模块接受自动错误定位引擎得到的多个错误定位结果,以投票的机制选出出现频率最高的错误点作为最终的错误定位结果报告给用户(开发 者)。
下面对蜕变模型以及其构造进行说明。图2描述了蜕变模型的构造过程与工作原理,蜕变模型的输入和原程序P的输入一致:
(1)蜕变模型接收原始输入I;
(2)根据蜕变关系在I的基础上生成转换后输入I’;
(3)用原始输入I执行P得到输出O;
(4)用转换后输入I’执行P得到输出O’;
(5)检查O与O’是否满足蜕变关系。
本方法预定义了一个蜕变模型程序的框架,内置了常用的输入转换操作与蜕变关系检查操作。用户(开发者)在构造蜕变模型的时候只需要在这个框架内填充少量代码,具体来说:在进行输入转换的时候既可以选择框架内已经内置的输入转换操作,也可以根据自身需要定义新的输入转换操作扩展内置的输入转换操作;同样,在蜕变关系检查的时候可以在框架内置的蜕变关系检查操作中进行选择,也可以根据自身需要定义新的蜕变关系检查操作。利用该框架,用户(开发者)可以很方便地完成蜕变模型的构造。
下面对自动错误定位引擎进行详细说明,该引擎是整个方法最核心的部分。图3描述了自动错误定位引擎的工作原理:自动错误定位引擎以错误输入作为初始输入执行蜕变模型。在执行的过程中,对应的路径条件被搜集。此次执行结束后,该路径条件的最后一个没有被处理的分支被倒转,得到一个新的路径条件,然后该引擎用约束求解器解这个新的路径条件,如果这个新的路径条件是可满足的,那么如图3所示,约束求解器求解这个新的路径条件并返回一组新的输入值作为下一次执行的输入,此次被倒转的分支将会被缓存,在下次分支倒转的时候,已经被缓存的分支会被直接跳过,避免重复搜索已经走过的路径;如果该路径不能被满足,那么跳过这个分支,继续倒转之前的一个分支。在生成新的输入之后,该引擎继续以此输入执行蜕变模型,同样在执行的过程中,其对应的执行路径会被搜集。如果新的这次执行依然错误,那么如图3所示,该引擎继续上述分支倒转过程,倒转下一个没有被处理过的分支,得到新的路径条件,用生成新的输入再次执行该蜕变模型;如果新的这次执行正确,那么终止分支倒转过程,将最后一次倒转的分支所对应的原程序中的代码行作为错误点。分支倒转的过程以发现 正确输入为终止。如果倒转所有的分支(搜索完所有可能的路径之后)之后依然没有发现正确输入,那么报告该程序中的错误无法被定位。该引擎得到的错误报告除了以上述分支倒转方法得到的错误点之外还包含错误执行的路径,开发者可以同时根据这个错误点和其错误路径发现原程序中真正的错误。
图4是本方法中错误定位过程的图形演示。图4展示了利用本发明所公开的方法去定位一个真实程序(求整数数组的最大连续子串和)中的错误的演示。我们利用到了该程序中的一个蜕变关系,即将整个数组倒转之后所得到的结果应该与原来的结果相等。根据此蜕变关系,我们生成了相应的蜕变模型,通过接下来的自动测试找到了相应的错误输入。利用动态符号执行与分支倒转,该工具定位到了原程序中的一个代码行。从图4中我们可以看出,本方法成功定位到了原程序错误代码所在的分支。
本发明的核心在于通过蜕变关系构造有Oracle的蜕变模型,在蜕变模型上利用动态符号执行技术通过系统地分支倒转定位到原程序中的错误代码。通过上述方法可以实现对没有Oracle的程序的自动错误定位,为开发者调试没有Oracle的程序提供有效的帮助。
上面结合附图对本发明的实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化。以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容做出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案内容,依据本发明的技术实质,在本发明的精神和原则之内,对以上实施例所作的任何简单的修改、等同替换与改进等,均仍属于本发明技术方案的保护范围之内。

一种程序中基于动态符号执行的自动错误定位方法.pdf_第1页
第1页 / 共10页
一种程序中基于动态符号执行的自动错误定位方法.pdf_第2页
第2页 / 共10页
一种程序中基于动态符号执行的自动错误定位方法.pdf_第3页
第3页 / 共10页
点击查看更多>>
资源描述

《一种程序中基于动态符号执行的自动错误定位方法.pdf》由会员分享,可在线阅读,更多相关《一种程序中基于动态符号执行的自动错误定位方法.pdf(10页珍藏版)》请在专利查询网上搜索。

本发明公开了一种程序中基于动态符号执行的自动错误定位方法,包括蜕变模型构造、测试引擎、自动错误定位引擎和错误定位结果整合;蜕变模型构造利用蜕变关系将没有Oracle的程序构造出有Oracle的程序,通过测试引擎进行测试,找到多个导致错误的输入,进而自动错误定位引擎利用动态符号执行技术,从这多个错误输入出发,分别通过分支倒转技术定位出原程序中的可能错误点,最后错误定位结果整合模块将多个定位结果利用投。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1