一种基于Actor模型的并行动态符号执行方法和系统转让专利

申请号 : CN201611237624.0

文献号 : CN106649124B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 常亮张晓文古天龙贾向阳徐周波张舜尧

申请人 : 桂林电子科技大学

摘要 :

本发明涉及一种基于Actor模型的并行动态符号执行方法和系统,方法包括将配置后的Actor模型的并行框架合并到修改后的动态符号执行工具中;Actor模型的多个工作节点通过通讯节点从预先构造的待求解路径栈中取出任务,并根据任务探索器获取所述任务的任务路径约束值;利用约束求解器对所述任务路径约束值进行求解,得到求解值Valuation;将求解值Valuation采用递归方式来代入所述待求解路径栈中的路径,生成待探索路径,将待探索路径存入预先构造的待探索路径栈中。本发明的提出一种并行动态符号执行方法,实现了两个层面上的并行,可以在多个节点上并行分析程序路径,可同次进行约束求解和路径探索,降低程序耗时,还可以加强测试大规模程序的能力。

权利要求 :

1.一种基于Actor模型的并行动态符号执行方法,其特征在于,包括如下步骤:步骤A:将动态符号执行工具的执行方式设置为满足并行框架执行的需求:所述动态符号执行工具为Jdar工具,将动态符号执行工具Jdar的模式设置为每次处理完一条路径即结束的模式来满足并行框架执行的需求;

步骤B:在Actor模型的并行框架中配置用于管理并行框架中各工作节点通讯的通讯节点,并将配置后的并行框架合并到修改后的动态符号执行工具中;

步骤C:Actor模型的多个工作节点通过通讯节点从预先构造的待求解路径栈中取出任务,并根据任务探索器获取所述任务的任务路径约束值;

步骤D:利用约束求解器对所述任务路径约束值进行求解,得到求解值Valuation;

步骤E:将求解值Valuation采用递归方式代入所述待求解路径栈中的路径,生成待探索路径,将待探索路径存入预先构造的待探索路径栈中。

2.根据权利要求1所述一种基于Actor模型的并行动态符号执行方法,其特征在于,还包括步骤F:根据待探索路径生成待测程序的测试用例,根据测试用例检测待测程序中的漏洞。

3.根据权利要求1所述一种基于Actor模型的并行动态符号执行方法,其特征在于,所述步骤B包括:在Actor模型的并行框架中配置通讯节点Master,所述通讯节点Master用于管理并行框架中各工作节点通讯和信息交互,并将已配置通讯节点的并行框架合并到修改后的动态符号执行工具的框架中,得到并行动态执行工具。

4.根据权利要求1所述一种基于Actor模型的并行动态符号执行方法,其特征在于,所述步骤C包括:启动并行动态执行工具中Actor模型的多个工作节点,所述多个工作节点通过通讯节点从预先构造的待求解路径栈中取出任务并将任务传递给任务探索器,所述任务探索器包括动态探索器和搜索器,动态探索器将任务中的并行任务重新分配给多个工作节点,搜索器在任务分配后的多个工作节点中获取任务路径约束值。

5.根据权利要求1所述一种基于Actor模型的并行动态符号执行方法,其特征在于,所述步骤D包括:步骤D1:将任务路径约束值保存在预先构造的约束求解值栈中;

步骤D2:将待求解路径栈中的任务分割为多个任务片段,将任务片段分别与约束求解值栈中的任务路径约束值进行比对,如果相同,则执行步骤D3,否则执行步骤D4;

步骤D3:从与任务路径约束值相同的任务片段中提取参数值A;

步骤D4:利用约束求解器Z3对该任务片段进行求解,将求解数值记为B;

步骤D5:将各参数值A和各求解数值B进行集合,得到数组[A,B],将数组[A,B]作为求解值Valuation。

6.根据权利要求1-5任一项所述一种基于Actor模型的并行动态符号执行方法,其特征在于,所述步骤E包括:步骤E1:将求解值Valuation采用递归方式依次代入待求解路径栈的每条路径,如果可满足当前路径,则生成待探索路径,再执行下一条路径,否则利用约束求解器Z3对求解值Valuation进行约束求解;

步骤E2:将待探索路径存入预先构造的待探索路径栈中。

7.一种基于Actor模型的并行动态符号执行系统,其特征在于,包括:

设置模块,用于将动态符号执行工具的执行方式设置为满足并行框架执行的需求:所述动态符号执行工具为Jdar工具,将动态符号执行工具Jdar的模式设置为每次处理完一条路径即结束的模式来满足并行框架执行的需求;

合并模块,用于在Actor模型的并行框架中配置用于管理并行框架中各工作节点通讯的通讯节点,并将配置后的并行框架合并到修改后的动态符号执行工具中;

任务求解模块,用于Actor模型的多个工作节点通过通讯节点从预先构造的待求解路径栈中取出任务,并根据任务探索器获取所述任务的任务路径约束值;

求解模块,用于利用约束求解器对所述任务路径约束值进行求解,得到求解值Valuation;

任务探索模块,用于将求解值Valuation采用递归方式来代入所述待求解路径栈中的路径,生成待探索路径,将待探索路径存入预先构造的待探索路径栈中。

8.根据权利要求7所述一种基于Actor模型的并行动态符号执行系统,其特征在于,还包括检测模块,根据待探索路径生成待测程序的测试用例,根据测试用例检测待测程序中的漏洞。

说明书 :

一种基于Actor模型的并行动态符号执行方法和系统

技术领域

[0001] 本发明主要涉及软件测试技术领域,具体涉及一种基于Actor模型的并行动态符号执行方法和系统。

背景技术

[0002] 1976年提出的符号执行技术,是一种静态的软件分析方法,它用符号值代替了具体值作为程序的输入,主要用来进行软件路径探索、测试用例生成和软件缺陷检测。动态符号执行是在符号执行发展过程中提出的一种方法,它结合了具体执行和符号执行的优点,在某些情况下,符号执行进行路径探索时路径约束可能无法求解出具体值,不能继续路径探索,这时利用动态符号执行就可以通过其具体执行来解决这个问题。
[0003] 传统的符号执行方式效率已经无法应对由于软件规模扩大而带来的软件复杂性。用传统的符号执行方式,对目前规模庞大,逻辑复杂的程序进行路径探索时,效率很低,耗时很长。这给符号执行在软件测试用例生成和缺陷检测方面的实用性带来了很大的挑战。
因此效率问题已经成为了符号执行研究的热点
[0004] 目前存在的解决办法:
[0005] (1)第一是考虑在探索路径收集路径约束时并行化:如Cloud9平台,其由一个负载均衡器和一群节点组成,每次路径探索都由负载均衡器协调多节点进行并行化路径探索。2010年Stats提出的一种基于Java PathFinder(JPF)并行随机搜索路径树的符号执行方法。符号执行过程中,由JPF先计算出一个不相交路径的集合,当其作为某个节点探索路径树的前置条件时,每个节点都会被引导去搜索执行所有路径互不相交的子集。这种方法是静态分配路径,总的执行时间是由执行最大子集的节点决定的。但是Cloud9在执行的过程中需要维护整棵符号执行树,路径搜索消耗大量多余时间,此外,Cloud9是针对经典的符号执行工具而非动态符号执行,在任务的产生和分配机制上与本文是不同的。
[0006] (2)第二是考虑在约束求解方面实现并行化:由Quoc-Sang Phan等人提出的Concurrent Bounded Model Checking(CBMC)方法,是由多线程实现的,在主线程进行路径探索时,其收集的路径约束并不进行约束求解,而是等到路径探索完成后,对其结构进行分析转化成一系列不相交的约束子集用多线程并发求解,这种方法可以提高求解效率,但缺点是其并不是真正的并行,而且在所有路径探索完成后才开始约束求解分析,浪费了中间的等待时间,降低了整体的效率
[0007] 在上述方法(1)中存在一个主要问题是维护的树问题,既在多节点执行任务时,该方法需要维护一整棵符号执行树,这样在探索的时候需要消耗大量的多余时间,此外,此方法是基于经典符号执行工具而言,不能针对动态符号执行工具而言,这样任务产生和分配需要浪费大量系统资源和时间。方法(2)中求解时采用并行技术,将各条路径的约束分配到多个节点进行求解,但是该方法只针对的是模型检测的应用场景,只对约束求解过程进行并行。

发明内容

[0008] 本发明所要解决的技术问题是针对现有技术的不足,提供一种基于Actor模型的并行动态符号执行方法和系统。
[0009] 本发明解决上述技术问题的技术方案如下:一种基于Actor模型的并行动态符号执行方法,包括如下步骤:
[0010] 步骤A:将动态符号执行工具的执行方式设置为满足并行框架执行的需求;
[0011] 步骤B:在Actor模型的并行框架中配置用于管理并行框架中各工作节点通讯的通讯节点,并将配置后的并行框架合并到修改后的动态符号执行工具中;
[0012] 步骤C:Actor模型的多个工作节点通过通讯节点从预先构造的待求解路径栈中取出任务,并根据任务探索器获取所述任务的任务路径约束值;
[0013] 步骤D:利用约束求解器对所述任务路径约束值进行求解,得到求解值Valuation;
[0014] 步骤E:将求解值Valuation采用递归方式来代入所述待求解路径栈中的路径,生成待探索路径,将待探索路径存入预先构造的待探索路径栈中。
[0015] 本发明的有益效果是:提出一种并行动态符号执行方法,实现了两个层面上的并行,可以在多个节点上并行分析程序路径,实现动态的负载均衡,可同次进行约束求解和路径探索,降低程序耗时,进一步提高了效率,还可以加强测试大规模程序的能力,结合了Actor传统并发模型,实现了节点之间的相互通信。
[0016] 在上述技术方案的基础上,本发明还可以做如下改进。
[0017] 进一步,还包括步骤F:根据待探索路径生成待测程序的测试用例,根据测试用例检测待测程序中的漏洞。
[0018] 采用上述进一步方案的有益效果是:具有测试大规模程序的能力。
[0019] 进一步,所述步骤A包括:所述动态符号执行工具为Jdar工具,将动态符号执行工具Jdar的模式设置为每次处理完一条路径即结束的模式来满足并行框架执行的需求;
[0020] 动态符号执行工具Jdar原来的执行方式为循环执行直到所有路径分析探索完成后结束的模式,需要将其模式修改为每次只分析探索一条路径就结束的模式,即单例模式,每次返回一条程序的测试路径;原始约束求解与对路径树的维护是一起工作的,将其拆分开了独立执行并行调度模TaskCenter与Solver来承担相应工作。
[0021] 采用上述进一步方案的有益效果是:将动态符号执行工具Jdar修改为单例模式能够和Actor模型实现合并。
[0022] 进一步,所述步骤B包括:在Actor模型的并行框架中配置通讯节点Master,所述通讯节点Master用于管理并行框架中各工作节点通讯和信息交互,并将已配置通讯节点的并行框架合并到修改后的动态符号执行工具的框架中,得到并行动态执行工具。
[0023] Actor是一种高性能的并行框架,将其配置到动态符号执行工具Jdar的框架中;
[0024] Actor模型虽然是并发模型,但是并不能满足动态符号执行的需求,在Actor框架中配置至少一个通讯节点Master,让其来管理Actor消息的交互,命名为Remote Actor,启动Remote Actor来执行消息交互任务。
[0025] 进一步,所述步骤C包括:启动并行动态执行工具中Actor模型的多个工作节点,所述多个工作节点从预先构造的待求解路径栈中取出任务并将任务传递给任务探索器,所述任务探索器包括动态探索器和搜索器,动态探索器将任务中的并行任务重新分配给多个工作节点,搜索器在任务分配后的多个工作节点中获取任务路径约束值。
[0026] 采用上述进一步方案的有益效果是:通过动态和静态的方式获取工作节点上的任务的任务路径约束值。
[0027] 进一步,所述步骤D包括:
[0028] 步骤D1:将任务路径约束值保存在预先构造的约束求解值栈中;
[0029] 步骤D2:将待求解路径栈中的任务分割为多个任务片段,将任务片段分别与约束求解值栈中的任务路径约束值进行比对,如果相同,则执行步骤D3,否则执行步骤D4;
[0030] 步骤D3:从与任务路径约束值相同的任务片段中提取参数值A;
[0031] 步骤D4:利用约束求解器Z3对该任务片段进行求解,将求解数值记为B;
[0032] 步骤D5:将各参数值A和各求解数值B进行集合,得到数组[A,B],将数组[A,B]作为求解值Valuation。
[0033] 进一步,所述步骤E的具体步骤为:
[0034] 步骤E1:将求解值Valuation采用递归方式依次代入待求解路径栈的每条路径,如果可满足当前路径,则生成待探索路径,再执行下一条路径,否则利用约束求解器Z3对求解值Valuation进行约束求解;
[0035] 步骤E2:将待探索路径存入预先构造的待探索路径栈中。
[0036] 采用上述进一步方案的有益效果是:将求解值Valuation作为一组新值代入待求解路径栈的任务队列中,能够使测试更准确,加强了测试大规模程序的能力。
[0037] 本发明解决上述技术问题的另一技术方案如下:一种基于Actor模型的并行动态符号执行系统,包括:
[0038] 设置模块,用于将动态符号执行工具的执行方式设置为满足并行框架执行的需求;
[0039] 合并模块,用于在Actor模型的并行框架中配置用于管理并行框架中各工作节点通讯的通讯节点,并将配置后的并行框架合并到修改后的动态符号执行工具中;
[0040] 任务求解模块,用于Actor模型的多个工作节点从预先构造的待求解路径栈中取出任务,并根据任务探索器获取所述任务的任务路径约束值;
[0041] 求解模块,用于利用约束求解器对所述任务路径约束值进行求解,得到求解值Valuation;
[0042] 任务探索模块,用于将求解值Valuation采用递归方式来代入所述待求解路径栈中的路径,生成待探索路径,将待探索路径存入预先构造的待探索路径栈中。
[0043] 在上述技术方案的基础上,本发明还可以做如下改进。
[0044] 进一步,还包括检测模块,根据待探索路径生成待测程序的测试用例,根据测试用例检测待测程序中的漏洞。
[0045] 本发明还提出了一种并行动态符号执行系统,实现了两个层面上的并行,可以在多个节点上并行分析程序路径,实现动态的负载均衡,可同次进行约束求解和路径探索,降低程序耗时,进一步提高了效率,还可以加强测试大规模程序的能力,结合了Actor传统并发模型,实现了节点之间的相互通信。

附图说明

[0046] 图1为本发明实施例提供的基于Actor模型的并行动态符号执行方法的方法流程图;
[0047] 图2为本发明实施例提供的基于Actor模型的并行动态符号执行系统的模块框图。

具体实施方式

[0048] 以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
[0049] 图1为本发明实施例提供的基于Actor模型的并行动态符号执行方法的方法流程图;
[0050] 如图1所示,一种基于Actor模型的并行动态符号执行方法,包括如下步骤:
[0051] 步骤A:将动态符号执行工具的执行方式设置为满足并行框架执行的需求;
[0052] 步骤B:在Actor模型的并行框架中配置用于管理并行框架中各工作节点通讯的通讯节点,并将配置后的并行框架合并到修改后的动态符号执行工具中;
[0053] 步骤C:Actor模型的多个工作节点通过通讯节点从预先构造的待求解路径栈中取出任务,并根据任务探索器获取所述任务的任务路径约束值;
[0054] 步骤D:利用约束求解器对所述任务路径约束值进行求解,得到求解值Valuation;
[0055] 步骤E:将求解值Valuation采用递归方式来代入所述待求解路径栈中的路径,生成待探索路径,将待探索路径存入预先构造的待探索路径栈中。
[0056] 上述实施例中,提出一种并行动态符号执行方法,实现了两个层面上的并行,可以在多个节点上并行分析程序路径,实现动态的负载均衡,可同次进行约束求解和路径探索,降低程序耗时,进一步提高了效率,还可以加强测试大规模程序的能力,结合了Actor传统并发模型,实现了节点之间的相互通信。
[0057] 可选地,作为本发明的一个实施例,还包括步骤F:根据待探索路径生成待测程序的测试用例,根据测试用例检测待测程序中的漏洞。
[0058] 上述实施例中,具有测试大规模程序的能力。
[0059] 下面详细描述构造待求解路径栈和待探索路径栈的实施过程:
[0060] 将探索出来的路径任务添加到待求解任务栈中等待工作节点取任务求解;
[0061] 将取出来的路径任务求解完成,生成对应测试用例和待探索任务,并且将待探索任务存入待探索任务栈中,待工作节点取相应任务探索;
[0062] 在待探索任务栈中取任务进行探索,在待求解任务栈中取任务进行求解,并且生成待探索任务,存入待探索任务栈。
[0063] 可选地,作为本发明的一个实施例,实现步骤A的具体方法为:所述动态符号执行工具为Jdar工具,将动态符号执行工具Jdar的模式修改为每次处理完一条路径即结束的模式来满足并行框架执行的需求;
[0064] 动态符号执行工具Jdar原来的执行方式为循环执行直到所有路径分析探索完成后结束的模式,需要将其模式修改为每次只分析探索一条路径就结束的模式,即单例模式,每次返回一条程序的测试路径;原始约束求解与对路径树的维护是一起工作的,将其拆分开了独立执行并行调度模TaskCenter与Solver来承担相应工作。
[0065] 上述实施例中,将动态符号执行工具Jdar修改为单例模式能够和Actor模型实现合并。
[0066] 可选地,作为本发明的一个实施例,实现步骤B的具体方法为:在Actor模型的并行框架中配置通讯节点Master,所述通讯节点Master用于管理并行框架中各工作节点通讯和信息交互,并将已配置通讯节点的并行框架合并到修改后的动态符号执行工具的框架中,得到并行动态执行工具。
[0067] Actor是一种高性能的并行框架,将其配置到动态符号执行工具Jdar的框架中;
[0068] Actor模型虽然是并发模型,但是并不能满足动态符号执行的需求,在Actor框架中配置至少一个通讯节点Master,让其来管理Actor消息的交互,命名为Remote Actor,启动Remote Actor来执行消息交互任务。
[0069] 可选地,作为本发明的一个实施例,实现步骤C的具体方法为:启动并行动态执行工具中Actor模型的多个工作节点,所述多个工作节点从预先构造的待求解路径栈中取出任务并将任务传递给任务探索器,所述任务探索器包括动态探索器和搜索器,动态探索器将任务中的并行任务重新分配给多个工作节点,搜索器在任务分配后的多个工作节点中获取任务路径约束值。
[0070] 上述实施例中,通过动态和静态的方式获取工作节点上的任务的任务路径约束值。
[0071] 具体的,在该实施例中,搜索器启动前,动态符号执行工具(Jdar)已运行并产生valuation值,将valuation值传入搜索器中进行初始化。
[0072] 下面详细描述该实施例的实施过程:
[0073] 启动Remote Actor模型,启动多个工作节点:Worker1、Worker2等;
[0074] 启动动态符号执行工具(Jdar);
[0075] 判断Jdart是不是为空,如果是则重新运行Jdart,否则接着执行符号执行操作;
[0076] 若Jdart不为空,新建一个Jdart Analysis,并且启动分析,然后将工作节点对象传递给动态探索器,并且使用传入的valuation值初始化搜索器中的值,执行分析,将分析结果存入待分析队列,然后判断分析队列是否为空;
[0077] 若分析队列为空,则返回空值,表示不存在分析任务,否则从待分析队列中取出任务进行分析;
[0078] 还可以设置一个用于检测待分析队列是否存在分析任务的监听器。执行该监听器,重置当前节点,准备接下来进行探索路径的获取工作。
[0079] 可选地,作为本发明的一个实施例,实现步骤D的具体步骤为:
[0080] 步骤D1:将任务路径约束值保存在预先构造的约束求解值栈中;
[0081] 步骤D2:多个工作节点通过通讯节点从待求解路径栈中取出任务;将任务分割为多个任务片段,将任务片段分别与约束求解值栈中的任务路径约束值进行比对,如果相同,则执行步骤D3,否则执行步骤D4;
[0082] 步骤D3:从与任务路径约束值相同的任务片段中提取参数值A;
[0083] 步骤D4:利用约束求解器Z3对该任务片段进行求解,将求解数值记为B;
[0084] 步骤D5:将各参数值A和各求解数值B进行集合,得到数组[A,B],将数组[A,B]作为求解值Valuation。
[0085] 实现步骤E的具体步骤为:
[0086] 步骤E1:将求解值Valuation采用递归方式依次执行待求解路径栈的每条路径,如果可满足当前路径,则生成待探索路径,再执行下一条路径,否则利用约束求解器Z3对求解值Valuation进行约束求解;下次操作时,程序使用该约束求解值执行下一条路径;
[0087] 步骤E2:将待探索路径存入预先构造的待探索路径栈中。
[0088] 上述实施例中,将求解值Valuation作为一组新值代入待求解路径栈的任务队列中,能够使测试更准确,加强了测试大规模程序的能力。
[0089] 图2为本发明实施例提供的基于Actor模型的并行动态符号执行系统的模块框图。
[0090] 可选地,作为本发明的另一个实施例,如图2所示,一种基于Actor模型的并行动态符号执行系统,包括:
[0091] 设置模块,用于将动态符号执行工具的执行方式设置为满足并行框架执行的需求;
[0092] 合并模块,用于在Actor模型的并行框架中配置用于管理并行框架中各工作节点通讯的通讯节点,并将配置后的并行框架合并到修改后的动态符号执行工具中;
[0093] 任务求解模块,用于Actor模型的多个工作节点从预先构造的待求解路径栈中取出任务,并根据任务探索器获取所述任务的任务路径约束值;
[0094] 求解模块,用于利用约束求解器对所述任务路径约束值进行求解,得到求解值Valuation;
[0095] 任务探索模块,用于将求解值Valuation采用递归方式来代入所述待求解路径栈中的路径,生成待探索路径,将待探索路径存入预先构造的待探索路径栈中。
[0096] 可选地,作为本发明的一个实施例,还包括检测模块,根据待探索路径生成待测程序的测试用例,根据测试用例检测待测程序中的漏洞。
[0097] 本发明还提出了一种并行动态符号执行系统,实现了两个层面上的并行,可以在多个节点上并行分析程序路径,实现动态的负载均衡,可同次进行约束求解和路径探索,降低程序耗时,进一步提高了效率,还可以加强测试大规模程序的能力,结合了Actor传统并发模型,实现了节点之间的相互通信。
[0098] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。