一种错误状态引导的符号执行方法

文档序号:34661215发布日期:2023-07-05 06:17阅读:21来源:国知局
本发明属于软件测试,尤其涉及一种错误状态引导的符号执行方法。
背景技术
::1、随着计算机应用范围的迅速扩大和人们对软件需求和功能性的要求越来越高,软件的实现逻辑也变得日趋复杂,这也导致在软件开发过程中,更可能出现软件缺陷和安全漏洞。gary mcgraw在其书《software security》中通过分析估计出,在导致软件安全问题的错误中,大约一半是由于实现过程中得遗漏、疏忽或者对需求的误解造成得。因此,软件需要能够准确地触发错误状态的测试输入去测试错误,一旦检测出错误,立刻去修复,这就可以很大程度上减少软件缺陷的修复成本。2、由于软件的复杂性和多样性,软件测试也有很多种不同的方法。其中,符号执行是解决冗余探索,提高覆盖率的一个有效的方法。使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。3、在过去的几年中,符号执行在自动测试案例生成方面取得了重大进步。但仍面临巨大的挑战。路径状态空间爆炸问题是符号执行面临的主要挑战之一。为了缓解符号执行中的路径爆炸问题,学者们从不同的角度提出了不同的解决方案。(1)采用启发式搜索策略。cadar等人在klee中综合使用了多种启发式搜索策略,从而避免单一的启发式搜索陷入局部最大测试覆盖率。koushik等在cute和jcute中使用了混合随机符号搜索策略,以提高测试的广度和深度。burnim等在crest中实现了多种启发式搜索策略,如随机分支搜索和控制流导向搜索策略。(2)修减冗余路径。通过分析得出哪些路径是冗余的,进而使得符号执行避免探索该路径。hanjun wang提出了一种依赖引导的符号执行技术,该技术通过基于符号值预测和消除冗余路径的方法来缓解路径爆炸问题。qiuping yi等人提出一种新的后置条件符号执行,该方法通过识别多个运行共享的路径后缀,并在测试生成过程中消除冗余路径后缀,该方法可以使路径的数量指数级的减少。david trabish提出了一个新的解决冗余路径的方法。该方法允许用户指定要排除的不感兴趣的代码,从而只针对重要的路径探索。(3)状态合并。godefroid等阐述了静态状态合并的原理及存在的问题。kuznetsov等提出了一种自动选择何时以及如何进行状态合并的方法。thanassis等提出了veritesting的概念,通过状态拟合减少程序的空间状态,提高符号执行的可用性。(4)重用技术。该技术通过缓存等方式存储函数的摘要,可以将底层函数的计算结果重用到高级函数中去,从而不需要重复的计算,减少分析的复杂性。4、综上所述,虽然在符号执行优化方面已有了一系列的研究工作,但依然面临着诸多的问题和不足。众所周知,在实际的开发过程中,面对成千上万行的代码,程序员不可避免地可能会造成各种各样的bug,面对众多类型的bug,生成能够精确触发错误状态的测试输入更是一个极其复杂的过程。根据pie模型,bug分为三类fault、error和failure。pie模型的前提是执行必须通过错误的代码行,执行错误的代码行必须触发错误的中间状态,最后,错误的中间状态必须被传播出去。因此,最佳的测试输入是能够直接执行到错误的代码行,并触发错误,更甚之可以将错误的状态传播出去。由此可见,这对测试输入的要求极高。一般来说,选择测试输入来触发错误的方法有自动生成具有高覆盖率的测试输入,或手动地构造合适的测试输入,以此来试图触发错误。然而,这都需要对整个程序进行彻底的探索,不仅费时费力,还不一定能够找到可以精确地触发错误,并将错误状态传播出去的测试输入。5、目前的符号执行技术想要生成能够精确触发错误的测试输入是十分困难的。主要存在以下几个缺陷:6、(1)测试用例的不确定性。目前的符号执行技术所生成的测试用例仅仅是为了满足相应的路径条件,可能无法同时满足触发错误状态的条件,由此导致生成能够探索到指定路径并生成能够精确触发错误状态的测试用例的偶然性很大。7、(2)路径状态空间的爆炸。虽然已经有能够有效缓解路径爆炸的技术,但是由于错误的代码行可能出现在程序的深层部分,想要准确地抵达错误的代码行仍有很大的不确定性。8、(3)付出巨大的代价。由于受路径爆炸的影响,符号执行中传统的搜索机制探索到包含错误行的路径极大可能需要耗费大量的时间。并且待符号执行完全执行完毕,面对众多的路径以及测试用例,准确地找到目标的路径及能够触发错误状态的测试输入需要付出很大的代价。技术实现思路1、本发明的目的,在于提供一种错误状态引导的符号执行方法,针对实际开发中,程序中可能出现的不同类型的错误,使得符号执行能够优先探索程序错误行的路径,并生成能够精确触发错误的测试输入。2、为了达成上述目的,本发明的解决方案是:3、一种错误状态引导的符号执行方法,该方法分为准备和符号执行两个阶段;其中,4、(1)准备阶段具体包括:5、步骤1.1:对待测试程序p进行约束插桩,获得修正后的程序p';6、步骤1.2:对程序p'进行依赖分析,得到程序p'中错误行的全部静态依赖关系,并生成“result.txt”文档;7、步骤1.3:初始化错误行的控制依赖表control dependency table,所述控制依赖表control dependency table由若干哈希表ctrldep_map组成;8、(2)符号执行阶段具体包括:9、步骤2.1:使用栈stack存储符号执行阶段若干待探索的任务,每个任务由一个二元组<pcon,φ>表示,其中pcon是一个用来指导探索特定的执行路径的约束条件组合,φ是用来避免探索重复路径的最后一个约束;10、步骤2.2:迭代地从栈stack中取出待探索的任务,进行路径探索和测试输入的生成,直至栈stack为空,结束符号执行;11、在每次迭代中,如果pcon是能够满足的,则使用约束求解器来生成该pcon对应的路径的测试输入,以求解约束;如果pcon是不能够满足的,则放弃对该pcon对应的路径的探索;12、在每次迭代中,对于每条路径和其生成的测试输入,都需要判断:①当前探索的路径是否执行到程序p'的错误行,②生成的测试输入是否能够触发错误状态:如果①和②均为是,则符号执行提前结束;如果①和②中任一为否,则对当前探索的路径进行动态依赖分析,以获取错误行在当前探索的路径中的前驱间接控制依赖,并将其记录在controldependency table中。13、进一步:所述步骤1.1具体为:14、首先,检测程序p中存在的错误语句e1以及e1所对应的正确语句e2;其次,计算e1!=e2,得到触发错误状态的约束ac;最后,在程序p中插入ac,生成修正后的程序p'。15、进一步:所述步骤1.2具体为:16、通过indus程序间分析工具检索程序p'中错误行的控制依赖和数据依赖,并通过indus提供的信息流分析程序p'中错误行的潜在依赖和交互依赖,得到程序p'中错误行的全部静态依赖关系,并生成“result.txt”文档。17、进一步:所述符号执行阶段,在开始符号执行时,将<true,true>压入栈stack中作为初始任务。18、进一步:所述步骤1.3中初始化控制依赖表control dependency table的具体步骤如下:19、步骤1.3.1:从“result.txt”文档中检索错误行的全部控制依赖分支;20、步骤1.3.2:依次判断步骤1.3.1中检索到的错误行的全部控制依赖分支的类型:21、若检索到的错误行的控制依赖分支是条件分支,则将检索到的错误行的控制依赖分支加入到一个哈希表ctrldep_map中,并更新对应的键和值;22、若检索到的错误行的控制依赖分支是函数调用分支,则继续检索错误行的函数调用分支的控制依赖分支,直至检索到的错误行的函数调用分支的控制依赖分支是条件分支时停止,将检索到的错误行的控制依赖分支加入到哈希表ctrldep_map中,并更新对应的键和值;23、其中,每个哈希表ctrldep_map的初始化键均为0,值均为tl,即:<0,tl>;更新时键的大小按照值的添加顺序依次增加。24、进一步:所述步骤2.1中使用错误行依赖优先搜索策略,生成待探索的任务,并将其加入栈stack中,具体为:25、步骤2.1.1:对当前探索的路径的约束条件组合进行分解,得到若干约束条件分支,依次遍历约束条件分支:对任一约束条件分支,判断其与错误行是否存在传递依赖关系,如果存在传递依赖关系,那么否定该约束条件分支,生成新的路径切片,探索下一条路径;如果不存在传递依赖关系,那么放弃否定该约束条件分支,直接跳过该约束条件分支,继续判断下一个约束条件分支;26、步骤2.1.2:依次遍历步骤2.1.1中生成的路径切片,若生成的路径切片中的最后一个约束存在于任意一个ctrldep_map的值中,则该路径切片π的键为该哈希表ctrldep_map中最后一个约束的值对应的键;若生成的路径切片π中的最后一个约束不存在于任意一个ctrldep_map的值中,则该路径切片的键为表示无穷大的max;27、步骤2.1.3:将步骤2.1.2中生成的路径切片按照键的大小进行排序,然后按键由小到大的顺序将路径切片作为待探索的任务加入栈stack中,等待后续符号执行。28、进一步:所述步骤2.2中对当前探索的路径进行动态依赖分析,以获取错误行在当前探索的路径中的前驱间接控制依赖的具体步骤如下:29、对当前探索的路径的约束条件组合进行分解,得到若干约束条件分支,依次遍历约束条件分支,得到错误行在当前探索的路径中的前驱间接控制依赖,并存入对应的哈希表ctrldep_map中;30、对任一约束条件分支,根据“result.txt”文档检索得到其控制依赖分支,若检索得到的控制依赖分支同时满足:①存在于当前探索的路径中,②是能够否定的条件分支,则该控制依赖分支是错误行在当前探索的路径中的前驱间接控制依赖,将其存入对应的哈希表ctrldep_map;否则,不存入。31、进一步:使用针对符号执行的监听器加载程序依赖分析对java pathfinder工具进行扩展,并按照以下步骤生成“.jpf”文件进行符号执行:32、(1)确定程序p'的方法和输入参数的个数;33、(2)设定java pathfinder执行的关键参数,关键参数包括symbolic.method,listener,classpath,target,symbolic.dp,symbolic.search_strategy,symbolic.error_branch,具体含义如下:34、symbolic.method:设置jpf要执行程序的方法;35、listener:设置jpf运行中的监听器,默认为gov.nasa.jpf.symbc.symboliclistener,algorithm.listener.steplistener,algorithm.listener.tcrlistenerreconsitution;36、classpath:用于向jvm传输目标类的路径;37、target:指定要分析的类;38、symbolic.dp:设置求解器的类型,设置为choco;39、symbolic.search_strategy:设置搜索策略,设置为错误行依赖优先搜索策略;40、symbolic.error_branch:程序错误行所在的具体分支。41、一种存储一个或多个程序的计算机可读存储介质,所述一个或多个程序包括指令,所述指令当由计算设备执行时,使得所述计算设备执行如上所述的方法。42、一种错误状态引导的符号执行设备,包括一个或多个处理器、一个或多个存储器以及一个或多个程序,其中一个或多个程序存储在所述一个或多个存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序包括用于执行如上所述方法的指令。43、本发明与现有技术相比,其显著优点是:44、(1)本发明通过对程序中的错误的类型附加的约束条件,而不是直接进行符号执行,使得生成的测试输入不仅仅满足当前的路径约束,还满足触发错误状态的条件;45、(2)本发明利用程序依赖关系来中止对不受错误行影响的程序行为的探索,从而减少了冗余路径的探索;46、(3)本发明利用程序中的错误行的控制依赖关系来确定路径探索的优先级,从而指导符号执行先探索最有可能执行到程序错误行的路径。大大减少了符号执行的时间成本。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1