CN116361182B - 一种错误状态引导的符号执行方法 - Google Patents

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

Info

Publication number
CN116361182B
CN116361182B CN202310344595.1A CN202310344595A CN116361182B CN 116361182 B CN116361182 B CN 116361182B CN 202310344595 A CN202310344595 A CN 202310344595A CN 116361182 B CN116361182 B CN 116361182B
Authority
CN
China
Prior art keywords
error
path
program
branch
symbol
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
CN202310344595.1A
Other languages
English (en)
Other versions
CN116361182A (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.)
Nanjing University of Aeronautics and Astronautics
Original Assignee
Nanjing University of Aeronautics and Astronautics
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 Nanjing University of Aeronautics and Astronautics filed Critical Nanjing University of Aeronautics and Astronautics
Priority to CN202310344595.1A priority Critical patent/CN116361182B/zh
Publication of CN116361182A publication Critical patent/CN116361182A/zh
Application granted granted Critical
Publication of CN116361182B publication Critical patent/CN116361182B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

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

本发明公开了一种错误状态引导的符号执行方法,该发明首先分析原始程序的错误类型,生成需要附加的约束条件,并将约束条件插桩到原始程序中得到修改后的程序。其次,本发明利用Indus程序间分析工具检索程序中错误行的控制依赖和数据依赖,同时利用Indus提供的信息流分析程序中错误行的潜在依赖和交互依赖,进而得到程序的全部静态依赖关系。在此基础上,本发明使用各种依赖关系对路径按照键值大小进行排序,从而有选择性地进行符号执行。通过这种方法,错误状态引导的符号执行能够优先探索程序错误行的路径,并生成能够精确触发错误的测试输入。因此,本发明提供了一种高效、精确的符号执行方法,适用于软件测试、程序分析等领域。

Description

一种错误状态引导的符号执行方法
技术领域
本发明属于软件测试技术领域,尤其涉及一种错误状态引导的符号执行方法。
背景技术
随着计算机应用范围的迅速扩大和人们对软件需求和功能性的要求越来越高,软件的实现逻辑也变得日趋复杂,这也导致在软件开发过程中,更可能出现软件缺陷和安全漏洞。Gary McGraw在其书《Software Security》中通过分析估计出,在导致软件安全问题的错误中,大约一半是由于实现过程中得遗漏、疏忽或者对需求的误解造成得。因此,软件需要能够准确地触发错误状态的测试输入去测试错误,一旦检测出错误,立刻去修复,这就可以很大程度上减少软件缺陷的修复成本。
由于软件的复杂性和多样性,软件测试也有很多种不同的方法。其中,符号执行是解决冗余探索,提高覆盖率的一个有效的方法。使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。
在过去的几年中,符号执行在自动测试案例生成方面取得了重大进步。但仍面临巨大的挑战。路径状态空间爆炸问题是符号执行面临的主要挑战之一。为了缓解符号执行中的路径爆炸问题,学者们从不同的角度提出了不同的解决方案。(1)采用启发式搜索策略。Cadar等人在KLEE中综合使用了多种启发式搜索策略,从而避免单一的启发式搜索陷入局部最大测试覆盖率。Koushik等在CUTE和jCUTE中使用了混合随机符号搜索策略,以提高测试的广度和深度。Burnim等在CREST中实现了多种启发式搜索策略,如随机分支搜索和控制流导向搜索策略。(2)修减冗余路径。通过分析得出哪些路径是冗余的,进而使得符号执行避免探索该路径。Hanjun Wang提出了一种依赖引导的符号执行技术,该技术通过基于符号值预测和消除冗余路径的方法来缓解路径爆炸问题。Qiuping Yi等人提出一种新的后置条件符号执行,该方法通过识别多个运行共享的路径后缀,并在测试生成过程中消除冗余路径后缀,该方法可以使路径的数量指数级的减少。David Trabish提出了一个新的解决冗余路径的方法。该方法允许用户指定要排除的不感兴趣的代码,从而只针对重要的路径探索。(3)状态合并。Godefroid等阐述了静态状态合并的原理及存在的问题。Kuznetsov等提出了一种自动选择何时以及如何进行状态合并的方法。Thanassis等提出了Veritesting的概念,通过状态拟合减少程序的空间状态,提高符号执行的可用性。(4)重用技术。该技术通过缓存等方式存储函数的摘要,可以将底层函数的计算结果重用到高级函数中去,从而不需要重复的计算,减少分析的复杂性。
综上所述,虽然在符号执行优化方面已有了一系列的研究工作,但依然面临着诸多的问题和不足。众所周知,在实际的开发过程中,面对成千上万行的代码,程序员不可避免地可能会造成各种各样的Bug,面对众多类型的Bug,生成能够精确触发错误状态的测试输入更是一个极其复杂的过程。根据PIE模型,Bug分为三类Fault、Error和Failure。PIE模型的前提是执行必须通过错误的代码行,执行错误的代码行必须触发错误的中间状态,最后,错误的中间状态必须被传播出去。因此,最佳的测试输入是能够直接执行到错误的代码行,并触发错误,更甚之可以将错误的状态传播出去。由此可见,这对测试输入的要求极高。一般来说,选择测试输入来触发错误的方法有自动生成具有高覆盖率的测试输入,或手动地构造合适的测试输入,以此来试图触发错误。然而,这都需要对整个程序进行彻底的探索,不仅费时费力,还不一定能够找到可以精确地触发错误,并将错误状态传播出去的测试输入。
目前的符号执行技术想要生成能够精确触发错误的测试输入是十分困难的。主要存在以下几个缺陷:
(1)测试用例的不确定性。目前的符号执行技术所生成的测试用例仅仅是为了满足相应的路径条件,可能无法同时满足触发错误状态的条件,由此导致生成能够探索到指定路径并生成能够精确触发错误状态的测试用例的偶然性很大。
(2)路径状态空间的爆炸。虽然已经有能够有效缓解路径爆炸的技术,但是由于错误的代码行可能出现在程序的深层部分,想要准确地抵达错误的代码行仍有很大的不确定性。
(3)付出巨大的代价。由于受路径爆炸的影响,符号执行中传统的搜索机制探索到包含错误行的路径极大可能需要耗费大量的时间。并且待符号执行完全执行完毕,面对众多的路径以及测试用例,准确地找到目标的路径及能够触发错误状态的测试输入需要付出很大的代价。
发明内容
本发明的目的,在于提供一种错误状态引导的符号执行方法,针对实际开发中,程序中可能出现的不同类型的错误,使得符号执行能够优先探索程序错误行的路径,并生成能够精确触发错误的测试输入。
为了达成上述目的,本发明的解决方案是:
一种错误状态引导的符号执行方法,该方法分为准备和符号执行两个阶段;其中,
(1)准备阶段具体包括:
步骤1.1:对待测试程序P进行约束插桩,获得修正后的程序P';
步骤1.2:对程序P'进行依赖分析,得到程序P'中错误行的全部静态依赖关系,并生成“result.txt”文档;
步骤1.3:初始化错误行的控制依赖表Control Dependency Table,所述控制依赖表Control Dependency Table由若干哈希表CtrlDep_map组成;
(2)符号执行阶段具体包括:
步骤2.1:使用栈Stack存储符号执行阶段若干待探索的任务,每个任务由一个二元组<pcon,φ>表示,其中pcon是一个用来指导探索特定的执行路径的约束条件组合,φ是用来避免探索重复路径的最后一个约束;
步骤2.2:迭代地从栈Stack中取出待探索的任务,进行路径探索和测试输入的生成,直至栈Stack为空,结束符号执行;
在每次迭代中,如果pcon是能够满足的,则使用约束求解器来生成该pcon对应的路径的测试输入,以求解约束;如果pcon是不能够满足的,则放弃对该pcon对应的路径的探索;
在每次迭代中,对于每条路径和其生成的测试输入,都需要判断:①当前探索的路径是否执行到程序P'的错误行,②生成的测试输入是否能够触发错误状态:如果①和②均为是,则符号执行提前结束;如果①和②中任一为否,则对当前探索的路径进行动态依赖分析,以获取错误行在当前探索的路径中的前驱间接控制依赖,并将其记录在ControlDependency Table中。
进一步:所述步骤1.1具体为:
首先,检测程序P中存在的错误语句E1以及E1所对应的正确语句E2;其次,计算E1!=E2,得到触发错误状态的约束AC;最后,在程序P中插入AC,生成修正后的程序P'。
进一步:所述步骤1.2具体为:
通过Indus程序间分析工具检索程序P'中错误行的控制依赖和数据依赖,并通过Indus提供的信息流分析程序P'中错误行的潜在依赖和交互依赖,得到程序P'中错误行的全部静态依赖关系,并生成“result.txt”文档。
进一步:所述符号执行阶段,在开始符号执行时,将<true,true>压入栈Stack中作为初始任务。
进一步:所述步骤1.3中初始化控制依赖表Control Dependency Table的具体步骤如下:
步骤1.3.1:从“result.txt”文档中检索错误行的全部控制依赖分支;
步骤1.3.2:依次判断步骤1.3.1中检索到的错误行的全部控制依赖分支的类型:
若检索到的错误行的控制依赖分支是条件分支,则将检索到的错误行的控制依赖分支加入到一个哈希表CtrlDep_map中,并更新对应的键和值;
若检索到的错误行的控制依赖分支是函数调用分支,则继续检索错误行的函数调用分支的控制依赖分支,直至检索到的错误行的函数调用分支的控制依赖分支是条件分支时停止,将检索到的错误行的控制依赖分支加入到哈希表CtrlDep_map中,并更新对应的键和值;
其中,每个哈希表CtrlDep_map的初始化键均为0,值均为TL,即:<0,TL>;更新时键的大小按照值的添加顺序依次增加。
进一步:所述步骤2.1中使用错误行依赖优先搜索策略,生成待探索的任务,并将其加入栈Stack中,具体为:
步骤2.1.1:对当前探索的路径的约束条件组合进行分解,得到若干约束条件分支,依次遍历约束条件分支:对任一约束条件分支,判断其与错误行是否存在传递依赖关系,如果存在传递依赖关系,那么否定该约束条件分支,生成新的路径切片,探索下一条路径;如果不存在传递依赖关系,那么放弃否定该约束条件分支,直接跳过该约束条件分支,继续判断下一个约束条件分支;
步骤2.1.2:依次遍历步骤2.1.1中生成的路径切片,若生成的路径切片中的最后一个约束存在于任意一个CtrlDep_map的值中,则该路径切片Π的键为该哈希表CtrlDep_map中最后一个约束的值对应的键;若生成的路径切片Π中的最后一个约束不存在于任意一个CtrlDep_map的值中,则该路径切片的键为表示无穷大的MAX;
步骤2.1.3:将步骤2.1.2中生成的路径切片按照键的大小进行排序,然后按键由小到大的顺序将路径切片作为待探索的任务加入栈Stack中,等待后续符号执行。
进一步:所述步骤2.2中对当前探索的路径进行动态依赖分析,以获取错误行在当前探索的路径中的前驱间接控制依赖的具体步骤如下:
对当前探索的路径的约束条件组合进行分解,得到若干约束条件分支,依次遍历约束条件分支,得到错误行在当前探索的路径中的前驱间接控制依赖,并存入对应的哈希表CtrlDep_map中;
对任一约束条件分支,根据“result.txt”文档检索得到其控制依赖分支,若检索得到的控制依赖分支同时满足:①存在于当前探索的路径中,②是能够否定的条件分支,则该控制依赖分支是错误行在当前探索的路径中的前驱间接控制依赖,将其存入对应的哈希表CtrlDep_map;否则,不存入。
进一步:使用针对符号执行的监听器加载程序依赖分析对Java PathFinder工具进行扩展,并按照以下步骤生成“.jpf”文件进行符号执行:
(1)确定程序P'的方法和输入参数的个数;
(2)设定Java PathFinder执行的关键参数,关键参数包括symbolic.method,listener,classpath,target,symbolic.dp,symbolic.search_strategy,symbolic.error_branch,具体含义如下:
symbolic.method:设置JPF要执行程序的方法;
listener:设置JPF运行中的监听器,默认为gov.nasa.jpf.symbc.SymbolicListener,algorithm.listener.StepListener,algorithm.listener.TCRListenerReconsitution;
classpath:用于向JVM传输目标类的路径;
target:指定要分析的类;
symbolic.dp:设置求解器的类型,设置为Choco;
symbolic.search_strategy:设置搜索策略,设置为错误行依赖优先搜索策略;
symbolic.error_branch:程序错误行所在的具体分支。
一种存储一个或多个程序的计算机可读存储介质,所述一个或多个程序包括指令,所述指令当由计算设备执行时,使得所述计算设备执行如上所述的方法。
一种错误状态引导的符号执行设备,包括一个或多个处理器、一个或多个存储器以及一个或多个程序,其中一个或多个程序存储在所述一个或多个存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序包括用于执行如上所述方法的指令。
本发明与现有技术相比,其显著优点是:
(1)本发明通过对程序中的错误的类型附加的约束条件,而不是直接进行符号执行,使得生成的测试输入不仅仅满足当前的路径约束,还满足触发错误状态的条件;
(2)本发明利用程序依赖关系来中止对不受错误行影响的程序行为的探索,从而减少了冗余路径的探索;
(3)本发明利用程序中的错误行的控制依赖关系来确定路径探索的优先级,从而指导符号执行先探索最有可能执行到程序错误行的路径。大大减少了符号执行的时间成本。
附图说明
图1是本发明实施的主要流程图;
图2是本发明实施的具体流程图。
具体实施方式
通过参考示范性实施例,本发明的目的和功能以及用于实现这些目的和功能的方法将得以阐明。然而,本发明并不受限于以下所公开的示范性实施例;可以通过不同形式来对其加以实现。说明书的实质仅仅是帮助相关领域技术人员综合理解本发明的具体细节。下面描述本发明实施的主要流程和具体步骤。
如图1所示的错误状态引导的符号执行方法流程,本发明的技术输入是一个待测试的原始程序,输入是路径和测试输入。本发明的过程分为两个重要的阶段:准备和符号执行。
准备阶段的主要任务是:(1)对原始程序进行约束插桩(插入触发错误状态的约束)以获得修正后的程序;(2)对修正后程序的进行依赖分析;(3)初始化控制依赖表以供后续使用。
在准备阶段的准备工作完成后,符号执行阶段将正式进入。符号执行阶段分为两个过程:路径生成和路径探索。在路径生成阶段,本发明的方法首先迭代生成路径和测试输入。然后,在生成每个测试输入后,判断测试输入是否触发错误状态,如果测试输入是可以触发程序的错误状态,则结束符号执行;否则,将进入以下过程。路径探索过程的主要任务是驱动未来的路径探索。首先,本发明对当前生成的路径进行动态依赖关系分析,然后将依赖关系信息传递到错误行依赖优先搜索策略中,在错误行依赖优先搜索策略中生成待探索的下一个切片以指导下一个路径探索。最后,待探索的切片被传递到第一个进程中,直到没有更多的切片可用于探索,则结束符号执行。
下面阐述本发明的实现过程和具体的步骤,如图2所示。
步骤1:对于待测的原始程序P,检测程序P中存在的错误语句E1以及E1所对应的正确语句E2,通过计算E1!=E2得到附加的触发错误状态的约束条件AC,然后将AC插入到程序P中,得到修改后的程序P'。
步骤2:对程序P'进行依赖分析,通过现有的Indus程序间分析工具来检索程序P'中错误行的控制依赖和数据依赖,并通过Indus提供的信息流分析程序中错误行的潜在依赖和交互依赖,进而得到程序P'中错误行TL的全部静态依赖关系,生成“result.txt”文档。
这里需要说明的是,本发明基于现有的Java PathFinder工具,简称JPF,通过使用针对符号执行的监听器加载程序依赖分析对JPF进行扩展,并按照以下步骤生成“.jpf”文件进行符号执行:
(1)分析程序P'中的测试类,并确定程序P'的方法和输入参数的个数。
(2)设定JPF执行的关键参数,关键参数包括symbolic.method,listener,classpath,target,symbolic.dp,symbolic.search_strategy,symbolic.error_branch。具体设置如下:
symbolic.method:设置JPF要执行程序的方法。
listener:设置JPF运行中的监听器,默认为gov.nasa.jpf.symbc.SymbolicListener,
algorithm.listener.StepListener,algorithm.listener.TCRListenerReconsitution;
classpath:用于向JVM传输目标类的路径。
target:指定要分析的类。
symbolic.dp:设置求解器的类型,设置为Choco。
symbolic.search_strategy:设置搜索策略,设置为错误行依赖优先搜索策略。
symbolic.error_branch:程序错误行所在的具体分支TL。
步骤3:根据生成的“result.txt”文档,初始化控制依赖表“Control DependencyTable”,本发明中控制依赖表Control Dependency Table由若干哈希表CtrlDep_map组成。
S310:根据symbolic.error_branch得到的程序错误行的分支TL,从“result.txt”文档中检索程序错误行TL的全部控制依赖分支。
S320:依次判断S310中检索到的错误行的全部控制依赖分支的类型:
若检索到的错误行的控制依赖分支是条件分支,则将检索到的错误行的控制依赖分支加入到一个哈希表CtrlDep_map中,并更新对应的键和值;
若检索到的错误行的控制依赖分支是函数调用分支,则继续检索错误行的函数调用分支的控制依赖分支,直至检索到的错误行的函数调用分支的控制依赖分支是条件分支时停止,将检索到的错误行的控制依赖分支加入到哈希表CtrlDep_map中,并更新对应的键和值;
其中,每个哈希表CtrlDep_map的初始化键均为0,值均为TL,即:<0,TL>;更新时键的大小按照值的添加顺序依次增加。
步骤4:本发明使用栈Stack来存储符号执行期间需要处理的任务。单个任务表示为一个二元组<pcon,φ>,其中,pcon是指导探索特定路径的约束组合,φ是用来避免探索重复路径的最后一个约束。在开始符号执行时,将<true,true>压入栈Stack中作为初始任务。
步骤5:符号执行期间,迭代地从Stack里取出待探索的任务用于路径探索和测试输入的生成,直至栈Stack为空,则符号执行结束。在每次迭代中,如果pcon是可满足的,则使用约束求解器生成该路径的测试输入来求解约束;若pcon是不可满足的,则放弃对该pcon对应的路径的探索。
在每次迭代中,对于每探索一条路径path并生成对应的测试输入T后,都需要进行判断:判断当前探索的路径path是否执行到程序的错误行TL,以及生成的测试输入T是否能够触发错误的测试输入。若两者均为是,则符号执行提前结束,即,当前探索的路径path能够指定到程序的错误行TL,并且生成的测试输入是能够精确触发错误状态的测试输入。若两者中任一为否,则继续进行符号执行,进入步骤6。
步骤6:利用步骤2生成的“result.txt”文档,以及步骤4生成的“ControlDependency Table”,对当前探索的路径path进行动态依赖分析,得到程序中的错误行TL在当前探索的路径path中的前驱间接控制依赖,并将其存入到Control Dependency Table中。
得到程序错误行TL在当前路径中的前驱直接控制依赖和前驱间接控制依赖的具体步骤如下:
S610:对当前探索的路径path的约束组合pcon进行分解得到若干约束条件分支φ,φ2,...,φn
S620:从φ1开始迭代地遍历pcon中的约束条件分支,并通过S2中生成的“result.txt”文档检索得到φi的控制依赖分支,若检索得到φi的控制依赖分支同时满足如下条件:(1)存在于当前探索的路径path中;(2)是能够否定的条件分支,则将其加入到CtrlDep_map;否则,不加入。
本发明中,采用错误行依赖优先搜索策略,利用Control Dependency Table中的信息,生成待探索的任务集合,放入栈Stack中。采用错误行依赖优先搜索策略得到待探索的路径集合的具体步骤如下:
(1):依次遍历当前路径path的约束组合pcon中的分支φ,φ2,...,φn
(2):根据生成的“result.txt”文档,可以判断符号执行过程中的约束条件φi与程序中的错误行TL是否存在传递依赖关系。如果存在传递依赖关系,即约束条件φi的结果会影响程序错误行TL的执行路径,那么否定φi分支,生成新的路径切片Π,进一步探索下一条路径。如果不存在传递依赖关系,即约束条件φi的结果不会影响程序错误行TL的执行路径,那么放弃否定φi分支,直接跳过该约束条件,继续遍历下一个约束条件。
(3):为(2)中生成的路径切片Π赋予键值
依次遍历(2)中生成的路径切片Π,若生成的路径切片Π中的最后一个约束φ存在于哈希表CtrlDep_map的值中,则路径切片Π的键为哈希表CtrlDep_map中约束φ的值对应的键。若生成的路径切片Π中的最后一个约束φ不存在于哈希表CtrlDep_map的值中,则路径切片Π的键为MAX,表示无穷大。
(4):按路径切片Π的键的大小,优先将键值最小的路径切片Π取出,作为下一条待探索的任务,放入栈Stack中,等待下次符号执行。即,按键由小到大的顺序将路径切片作为待探索的任务加入栈Stack中,等待后续符号执行。
本发明中符号执行彻底结束后,生成已探索的路径集合“feasible Path.txt”文档,生成已探索的路径对应的测试输入集合“all testcase.txt”文档,生成符号执行的结果信息“result_info.txt”文档。其中“result_info.txt”包含以下内容:
Elapsed time_ms:符号执行的时间;
Feasible Path:符号执行已探索的路径条数;
Execution Fault Path:探索到程序错误行的路径条数;
solver caller:约束求解器的调用时间;
若Execution Fault Path=1,则表明错误状态引导的符号执行技术探索到了程序的错误行,生成了精确触发错误的测试输入。
基于相同的技术方案,本发明还公开了一种存储一个或多个程序的计算机可读存储介质,所述一个或多个程序包括指令,所述指令当由计算设备执行时,使得所述计算设备执行上述符号执行方法。
基于相同的技术方案,本发明还公开了一种计算设备,包括一个或多个处理器、一个或多个存储器以及一个或多个程序,其中一个或多个程序存储在所述一个或多个存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序包括用于执行上述符号执行方法的指令。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

Claims (8)

1.一种错误状态引导的符号执行方法,其特征在于:该方法分为准备和符号执行两个阶段;其中,
(1)准备阶段具体包括:
步骤1.1:对待测试程序P进行约束插桩,获得修正后的程序P';
步骤1.2:对程序P'进行依赖分析,得到程序P'中错误行的全部静态依赖关系,并生成“result.txt”文档;
步骤1.3:初始化错误行的控制依赖表Control Dependency Table,所述控制依赖表Control Dependency Table由若干哈希表CtrlDep_map组成;
(2)符号执行阶段具体包括:
步骤2.1:使用栈Stack存储符号执行阶段若干待探索的任务,每个任务由一个二元组<pcon, φ> 表示,其中pcon是一个用来指导探索特定的执行路径的约束条件组合,φ是用来避免探索重复路径的最后一个约束;
步骤2.2:迭代地从栈Stack中取出待探索的任务,进行路径探索和测试输入的生成,直至栈Stack为空,结束符号执行;
在每次迭代中,如果pcon是能够满足的,则使用约束求解器来生成该pcon对应的路径的测试输入,以求解约束;如果pcon是不能够满足的,则放弃对该pcon对应的路径的探索;
在每次迭代中,对于每条路径和其生成的测试输入,都需要判断:①当前探索的路径是否执行到程序P'的错误行,②生成的测试输入是否能够触发错误状态:如果①和②均为是,则符号执行提前结束;如果①和②中任一为否,则对当前探索的路径进行动态依赖分析,以获取错误行在当前探索的路径中的前驱间接控制依赖,并将其记录在Control DependencyTable中;
所述步骤1.1具体为:
首先,检测程序P中存在的错误语句E1以及E1所对应的正确语句E2;其次,计算E1 !=E2,得到触发错误状态的约束AC;最后,在程序P中插入AC,生成修正后的程序P';
所述步骤2.1中使用错误行依赖优先搜索策略,生成待探索的任务,并将其加入栈Stack中,具体为:
步骤2.1.1:对当前探索的路径的约束条件组合进行分解,得到若干约束条件分支,依次遍历约束条件分支:对任一约束条件分支,判断其与错误行是否存在传递依赖关系,如果存在传递依赖关系,那么否定该约束条件分支,生成新的路径切片Π,探索下一条路径;如果不存在传递依赖关系,那么放弃否定该约束条件分支,直接跳过该约束条件分支,继续判断下一个约束条件分支;
步骤2.1.2:依次遍历步骤2.1.1中生成的路径切片,若生成的路径切片Π中的最后一个约束存在于任意一个CtrlDep_map的值中,则该路径切片Π的键为该哈希表CtrlDep_map中最后一个约束的值对应的键;若生成的路径切片Π中的最后一个约束不存在于任意一个CtrlDep_map的值中,则该路径切片Π的键为表示无穷大的MAX;
步骤2.1.3:将步骤2.1.2中生成的路径切片Π按照键的大小进行排序,然后按键由小到大的顺序将路径切片Π作为待探索的任务加入栈Stack中,等待后续符号执行。
2.根据权利要求1所述的一种错误状态引导的符号执行方法,其特征在于:所述步骤1.2具体为:
通过Indus程序间分析工具检索程序P'中错误行的控制依赖和数据依赖,并通过Indus提供的信息流分析程序P'中错误行的潜在依赖和交互依赖,得到程序P'中错误行的全部静态依赖关系,并生成“result.txt”文档。
3.根据权利要求1所述的一种错误状态引导的符号执行方法,其特征在于:所述符号执行阶段,在开始符号执行时,将<true,true>压入栈Stack中作为初始任务。
4.根据权利要求1所述的一种错误状态引导的符号执行方法,其特征在于:所述步骤1.3中初始化控制依赖表Control Dependency Table的具体步骤如下:
步骤1.3.1:从“result.txt”文档中检索错误行的全部控制依赖分支;
步骤1.3.2:依次判断步骤1.3.1中检索到的错误行的全部控制依赖分支的类型:
若检索到的错误行的控制依赖分支是条件分支,则将检索到的错误行的控制依赖分支加入到一个哈希表CtrlDep_map中,并更新对应的键和值;
若检索到的错误行的控制依赖分支是函数调用分支,则继续检索错误行的函数调用分支的控制依赖分支,直至检索到的错误行的函数调用分支的控制依赖分支是条件分支时停止,将检索到的错误行的控制依赖分支加入到哈希表CtrlDep_map中,并更新对应的键和值;
其中,每个哈希表CtrlDep_map的初始化键均为0,值均为TL,即:<0,TL>;更新时键的大小按照值的添加顺序依次增加。
5.根据权利要求1所述的一种错误状态引导的符号执行方法,其特征在于:所述步骤2.2中对当前探索的路径进行动态依赖分析,以获取错误行在当前探索的路径中的前驱间接控制依赖的具体步骤如下:
对当前探索的路径的约束条件组合进行分解,得到若干约束条件分支,依次遍历约束条件分支,得到错误行在当前探索的路径中的前驱间接控制依赖,并存入对应的哈希表CtrlDep_map中;
对任一约束条件分支,根据“result.txt”文档检索得到其控制依赖分支,若检索得到的控制依赖分支同时满足:①存在于当前探索的路径中,②是能够否定的条件分支,则该控制依赖分支是错误行在当前探索的路径中的前驱间接控制依赖,将其存入对应的哈希表CtrlDep_map;否则,不存入。
6.根据权利要求1所述的一种错误状态引导的符号执行方法,其特征在于:使用针对符号执行的监听器加载程序依赖分析对Java PathFinder工具进行扩展,并按照以下步骤生成“.jpf”文件进行符号执行:
确定程序P'的方法和输入参数的个数;
设定Java PathFinder执行的关键参数,关键参数包括symbolic.method,listener,classpath,target,symbolic.dp,symbolic.search_strategy,symbolic.error_branch,具体含义如下:
symbolic.method:设置JPF要执行程序的方法;
listener:设置JPF运行中的监听器,默认为gov.nasa.jpf.symbc.SymbolicListener,algorithm.listener.StepListener,algorithm.listener.TCRListenerReconsitution;
classpath:用于向JVM传输目标类的路径;
target:指定要分析的类;
symbolic.dp:设置求解器的类型,设置为Choco;
symbolic.search_strategy:设置搜索策略,设置为错误行依赖优先搜索策略;
symbolic.error_branch:程序错误行所在的具体分支。
7.一种存储一个或多个程序的计算机可读存储介质,所述一个或多个程序包括指令,其特征在于,所述指令当由计算设备执行时,使得所述计算设备执行如权利要求1至6中任一所述的方法。
8.一种错误状态引导的符号执行设备,其特征在于,包括一个或多个处理器、一个或多个存储器以及一个或多个程序,其中一个或多个程序存储在所述一个或多个存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序包括用于执行如权利要求1至6中任一所述方法的指令。
CN202310344595.1A 2023-04-03 2023-04-03 一种错误状态引导的符号执行方法 Active CN116361182B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310344595.1A CN116361182B (zh) 2023-04-03 2023-04-03 一种错误状态引导的符号执行方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310344595.1A CN116361182B (zh) 2023-04-03 2023-04-03 一种错误状态引导的符号执行方法

Publications (2)

Publication Number Publication Date
CN116361182A CN116361182A (zh) 2023-06-30
CN116361182B true CN116361182B (zh) 2023-12-05

Family

ID=86937685

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310344595.1A Active CN116361182B (zh) 2023-04-03 2023-04-03 一种错误状态引导的符号执行方法

Country Status (1)

Country Link
CN (1) CN116361182B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102222035A (zh) * 2011-07-25 2011-10-19 公安部第三研究所 基于符号执行技术的软件行为检测系统及检测方法
CN103559122A (zh) * 2013-10-14 2014-02-05 西安交通大学 基于程序行为切片的测试案例约减方法
CN104750608A (zh) * 2015-03-25 2015-07-01 南京大学 一种程序中基于动态符号执行的自动错误定位方法
CN105468521A (zh) * 2015-11-18 2016-04-06 北京航空航天大学 一种基于子图搜索的指针相关语义错误定位方法
CN115098292A (zh) * 2022-07-05 2022-09-23 中国电信股份有限公司 应用程序崩溃根原因识别方法、装置及电子设备
CN115576840A (zh) * 2022-11-01 2023-01-06 中国科学院软件研究所 基于机器学习的静态程序插桩检测方法及装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20090138854A1 (en) * 2007-11-22 2009-05-28 Suresh Mani Software error detection method, software module, database and system
US8572529B2 (en) * 2011-06-08 2013-10-29 Cadence Design Systems, Inc. System and method for dynamically injecting errors to a user design

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102222035A (zh) * 2011-07-25 2011-10-19 公安部第三研究所 基于符号执行技术的软件行为检测系统及检测方法
CN103559122A (zh) * 2013-10-14 2014-02-05 西安交通大学 基于程序行为切片的测试案例约减方法
CN104750608A (zh) * 2015-03-25 2015-07-01 南京大学 一种程序中基于动态符号执行的自动错误定位方法
CN105468521A (zh) * 2015-11-18 2016-04-06 北京航空航天大学 一种基于子图搜索的指针相关语义错误定位方法
CN115098292A (zh) * 2022-07-05 2022-09-23 中国电信股份有限公司 应用程序崩溃根原因识别方法、装置及电子设备
CN115576840A (zh) * 2022-11-01 2023-01-06 中国科学院软件研究所 基于机器学习的静态程序插桩检测方法及装置

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
A Test Data Generation Approach for Automotive Software;Jungui Zhou等;《2015 IEEE International Conference on Software Quality, Reliability and Security - Companion》;216-220 *
基于符号执行的软件测试技术研究与设计;汪勇;《中国优秀硕士学位论文全文数据库 信息科技辑》;I138-718 *
程序状态条件合并中变量隐式关联分析方法;郭曦;王盼;;计算机研究与发展(第10期);2331-2342 *
编程现场上下文深度感知的代码行推荐;陶传奇 等;《软件学报》;第32卷(第11期);3351-3371 *

Also Published As

Publication number Publication date
CN116361182A (zh) 2023-06-30

Similar Documents

Publication Publication Date Title
US7681180B2 (en) Parameterized test driven development
US8589892B2 (en) Verification of speculative execution
Soltani et al. A guided genetic algorithm for automated crash reproduction
ben Fadhel et al. Search-based detection of high-level model changes
Partush et al. Abstract semantic differencing for numerical programs
US20150143179A1 (en) System and Method for Progressive Fault Injection Testing
Abdulla et al. The best of both worlds: Trading efficiency and optimality in fence insertion for TSO
CN104090798B (zh) 动静态结合的中断驱动程序数据竞争检测方法
Li et al. Practical symbolic race checking of GPU programs
CN110515826B (zh) 一种基于次数频谱与神经网络算法的软件缺陷定位方法
WO2008043005A1 (en) Model checking parameterized threads for safety
US20030088810A1 (en) Methods and apparatus for determining software component sizes associated with errors
US11249888B1 (en) System and method for generating counterexample tests of incidental invariants
CN116361182B (zh) 一种错误状态引导的符号执行方法
JP2020067697A (ja) デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置
Toth et al. Using version control history to follow the changes of source code elements
Elgendy et al. A GA-based approach to automatic test data generation for ASP .NET web applications
CN114138669A (zh) 一种基于函数级选择符号化混合执行的软件自动测试方法
CN114036040A (zh) 基于细粒度信息同步的软件混合模糊测试方法及设备
KR102185294B1 (ko) 병렬 프로그램의 소스 코드 분석 장치 및 방법, 기록매체
CN110209593B (zh) 一种面向偏好设置的安卓应用测试方法
CN111124922A (zh) 基于规则的自动程序修复方法、存储介质和计算设备
Aljedaani et al. Empirical study of software test suite evolution
Ren et al. Bug Reproduction Based on EFSM Model
Shanthi et al. A heuristic technique for automated test cases generation from UML activity diagram

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