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

文档序号:8430645阅读:360来源:国知局
一种程序中基于动态符号执行的自动错误定位方法
【技术领域】
[0001]本发明公开了一种程序中基于动态符号执行的自动错误定位方法,涉及自动软件测试与自动软件缺陷定位技术,属于软件工程技术领域。
【背景技术】
[0002]自动软件错误定位对于保证软件质量来说至关重要,但一直以来自动软件错误定位都是一个非常困难的任务。对存在Oracle问题的程序进行自动错误定位就更困难了。而如今随着软件行业的发展,越来越多像机器学习,科学计算,编译器等领域的程序中存在Oracle问题,这些都给自动错误定位带来了非常大的挑战。而此类软件的质量保证同样非常重要,从而需要一种技术来对此类程序进行自动错误定位。
[0003]目前传统的自动软件错误定位技术大多需要利用程序的Oracle。其中一类技术利用正确的测试执行路径与错误的测试执行路径,利用复杂的程序分析技术找到软件中的可疑代码片段报告给开发者。另一类基于统计的错误定位技术搜集大量的正确和错误的执行路径,借助统计技术计算每一个软件中的实体单元(代码行、方法)与程序错误的关联程度,并以此为依据为每一个软件实体单元进行打分并根据打分并根据打分对所有软件实体单元进行排序,将得分最高软件实体单元报告给开发者。然而在没有Oracle的程序中,软件的一次执行是正确还是错误是无法判断的,所以传统的软件错误定位技术往往无法定位这类程序中的错误。针对测试没有Oracle的程序,蜕变测试利用挖掘软件中存在的蜕变关系测试程序,但是无法定位软件中存在的错误。另外,还有一些技术将蜕变测试与基于统计的错误定位相结合找到没有Oracle的软件中的可疑代码片段,但此类方法需要大量的通过和违反蜕变关系的测试用例,而往往这些测试用例非常难以获得。这些都给自动定位没有Oracle的软件中的错误带来了巨大困难。

【发明内容】

[0004]本发明所要解决的技术问题是:针对现有技术的缺陷,提供一种程序中基于动态符号执行的自动错误定位方法,针对没有Oracle的软件,进行自动错误定位。该方法利用蜕变关系为没有Oracle的原程序构造一个有Oracle的新程序,在这个构造的新程序上利用自动随机测试找到错误输入,然后通过动态符号执行技术进行分支倒转从而自动定位软件中的错误。
[0005]本发明为解决上述技术问题采用以下技术方案:
[0006]一种程序中基于动态符号执行的自动错误定位方法,具体步骤包括:
[0007]步骤一、针对原程序中蕴含的蜕变关系,为原程序构造蜕变模型,使得原程序转变为含有Oracle的程序;
[0008]步骤二、构建测试引擎,随机生成输入并执行步骤一中构造的每一个蜕变模型,为每一个蜕变模型找到导致蜕变模型产生错误的输入;
[0009]步骤三、构建自动错误定位引擎,针对每一个蜕变模型,启动动态符号执行,定位出原程序代码中的错误行;
[0010]步骤四、对步骤三得到的代码中的错误行进行错误定位结果整合,采用投票机制得到最终的错误定位结果。
[0011 ] 作为本发明的进一步优选方案,步骤一中,所述构造蜕变模型的具体流程包括:
[0012]预定义蜕变模型的程序框架并内置输入转换规则与蜕变关系检查规则,用户在所述程序框架内选择内置输入转换规则进行输入转换;
[0013]选择蜕变关系检查规则进行蜕变关系检查;
[0014]或者根据需要重写、扩展输入转换规则和蜕变关系检查规则,从而构造出有Oracle的程序。
[0015]作为本发明的进一步优选方案,步骤二中,所述执行蜕变模型的具体流程包括:
[0016]读取原程序的输入,根据蜕变关系将原输入转换成蜕变后输入;
[0017]以原输入执行原程序得到原输出,以蜕变后输入执行原程序得到转换后的输出;
[0018]检查原输出与转换后的输出是否违反蜕变关系,进而判断原程序中是否存在错误。
[0019]作为本发明的进一步优选方案,所述步骤三的具体过程包括:
[0020]以步骤二中生成的错误输入为初始输入执行蜕变模型,并搜集此次执行的路径约束条件;
[0021]通过依次倒转路径条件分支生成新的输入;
[0022]以新的输入再次执行蜕变模型,直到新生成的输入让蜕变模型执行正确;
[0023]发现蜕变模型执行正确之后,将最后倒转的分支条件所对应的原程序代码行作为错误点。
[0024]作为本发明的进一步优选方案,步骤四中,所述错误定位结果整合具体为:针对同一个原程序的不同蜕变模型以及同一个蜕变模型的不同错误输入得到的定位结果,采用投票机制进行投票,选出出现次数最多的代码行作为最终的错误点报告给用户。
[0025]作为本发明的进一步优选方案,所述蜕变模型按照蜕变关系的约束封装了输入转换,并且用原输入以及转换后的输入依次执行原程序得到相应输出,最后检查得到的输出是否满足蜕变关系的约束;
[0026]蜕变模型在原程序基础之上构造一个新程序,读取与原程序一致的输入,判断输出通过或者不通过:
[0027]当输出不通过时表明原程序存在错误,蜕变模型起到Oracle的作用,将检查结果呈现给用户。
[0028]作为本发明的进一步优选方案,步骤二中:
[0029]所述错误输入的数目由用户根据需要配置;
[0030]测试引擎设定测试执行次数上限,在达到测试执行次数上限时,如果仍未能找到错误的输入,则停止测试,并标记这个蜕变模型的错误无法被检测。
[0031]作为本发明的进一步优选方案,步骤三中,所述自动错误定位引擎基于JavaPathfinder平台设计,通过扩展Symbolic Pathfinder对程序进行动态符号执行,实现了系统分支倒转方法,完成对程序的错误定位;所述自动错误定位引擎在分支倒转过程中使用Choco与CVC3作为约束求解器求解新生成的路径条件。
[0032]所述自动错误定位引擎的输入是一个蜕变模型和其对应的一个错误输入,输出是原程序中的一个错误点。由于对于一个原程序有多个蜕变模型,而对于每个蜕变模型会有多个错误输入,所以自动错误定位引擎针对一个程序会得到多个错误点;所述自动错误定位引擎使用了动态符号执行技术,以错误输入为初始输入具体执行蜕变模型,同时搜集对应的执行路径条件PC,执行结束之后从路径条件PC的末尾的分支(记为cn)开始进行倒转,得到新的路径条件,然后使用约束求解器对新得到的路径条件进行可满足性判断,如果不满足则向前倒转下一个没被倒转过的分支;如果可满足,则解出满足这个新的路径条件的输入的具体值,并用这个新的输入再次执行蜕变模型,同样在执行过程中同时搜集对应的新的路径约束PC1,如果此次执行正确,那么将cn对应的代码行作为错误点;如果此次执行错误,那么从PCl开始继续迭代上述过程搜索新输入,直到倒转某个分支ci之后生成的新输入让蜕变模型执行正确,将ci对应的代码行作为错误点;所述自动错误定位引擎将错误的执行路径(执行代码的序列)与定位的错误点同时报告给用户(开发者),更有效地帮助用户(开发者)找到原程序中错误的代码。
[0033]本发明采用以上技术方案与现有技术相比,具有以下技术效果:本发明所公开的方法只在初始阶段需要极少的人工干预,整个过程高度自动化,能够有效地定位没有Oracle的软件中的错误,为开发者调试此类程序提供重要的帮助。
【附图说明】
[0034]图1为本发明的方法结构图。
[0035]图2为本发明中蜕变模型构造的描述图。
[0036]图3为本发明中基于动态符号执行通过分支倒转的错误定位原理图。
[0037]图4为本发明中自动错误定位工具演示图。
【具体实施方式】
[0038]下面详细描述本发明的实施方式,所述实施方式的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
[0039]下面结合附图对本发明的技术方案做进一步的详细说明:
[0040]如图1所示,在本发明的一个具体实施例中,面向没有Oracle的程序,需要用户根据原程序与原程序所蕴含的蜕变关系构造出包含Oracle的新程序,将所述新程序定义为蜕变模型,这个过程只需要用户在本方法预定义好的程序框架中进行少量的代码填充即可完成。由于原程序中可能蕴含多个蜕变关系,所以可以生成多个蜕变模型。在构造好蜕变模型之后,我们得到的是含有Oracle的新程序,解决了原程序的Oracle问题。接下来测试引擎随机生成输入执行生成的蜕变模型,测试引擎将会为每个蜕变模型找到多个错误输入作为自动错误定位引擎的初始输入。如果在用户指定的测试时间(或测试用例个数)上限内没有找到使蜕变模型错误的输入,那么测试引擎将报告没有发现错误。
[0041]在测试引擎找到错误输入之后,自动错误定位引擎将会分别从各个蜕变模型以及其对应的各个错误输入开始定位程序中的错误。自动错误定位引擎的每一次单独错误定位输入是一个蜕变模型以及其对应的错误输入对<M,If>,它以错误输入If为初始输入对蜕变模型M进行动态符号执行,通过系统地分支倒转不断为蜕变模型M生成新的输入,最终搜索到正确的输入,发现关键分支并将其对应的原程序的代码行作为错误点。由于一个原程序可以有多个蜕变模型,而测试引擎为每个蜕变模型找到多个错误输入,所以会有多个蜕变模型与其对应的错误输入对<M,If>,自动错误定位引擎将多次被调用,得到多个错误定位结果。最后错误定位结果整合模块将以投票的方式整合多个错误定位结果,将出现频率最高的错误点作为最终的错误定位结果。同时,错误执行的执行路径也会和定位的错误点一起报告给用户(开发者),帮助开发者找到程序中的错误。
[0042]在具体过程中,蜕变模型的生成是用户(开发者)在本方法预定义的蜕变模型程序框架内填充少量的代码完成的,用户可以根据需要
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1