一种实时系统的循环边界内向分析方法
【专利摘要】本发明提出了一种针对实时系统的循环边界内向分析方法,该方法基于修改符号执行的路径搜索方式,使得执行引擎能够快速定位到系统中各循环的最大迭代路径,并以此为基础高效地获得系统中各循环边界的估计值。本方法所求得的循环边界估计值具有如下特征:系统能保证每一个循环边界估计值都具有可达性,即一定存在一个系统输入,使得该输入下的系统运行达到边界估计值所获得的循环迭代次数。作为传统循环边界分析方法的必要补充技术,本发明所提出的循环边界内向分析方法可用于估算系统至少能够达到的最大循环迭代次数,从而使得用户能够更为完整有效的分析实时系统的循环边界,提高系统质量。
【专利说明】一种实时系统的循环边界内向分析方法
【技术领域】
[0001]本发明涉及一种动静态结合的实时系统的循环边界分析方法,主要利用目标制导的符号执行技术来跟踪循环边界的执行条件,从而实现从内向分析的角度来估算实时系统的循环边界,属于计算机技术、实时系统分析交叉技术应用领域。
【背景技术】
[0002]循环边界是影响实时系统实时性保障的重要因素。它是指当前系统的任意一次执行,会使循环可能达到的最大迭代次数。由于问题本身的不可判定性,对循环边界的分析不可避免地会引入误差。按照所引入的误差使得分析的结果偏大还是偏小,可以将循环边界分析方法划分为外向分析和内向分析两类。
[0003]已有的循环边界分析方法均为外向分析。该类分析出于保障实时系统安全性的角度考虑,所得的分析结果是实际系统中循环边界的高估值。这使得外向分析的结果,可以直接用于估算实时系统最坏情况下的执行时间,从而为设计实时系统提供参考依据。
[0004]在实际应用中,循环边界外向分析方法的所得到的高估值有时会偏离实际边界值很远,从而造成系统硬件资源的浪费,本发明给出的内向分析方法旨在为解决这一问题提供条件。作为一种必要的补充技术,循环边界内向分析可用于估算循环至少能够达到的最大迭代次数。用户结合传统的外向分析方法和本发明提出的内向分析方法,可以明确获得循环边界的实际范围与误差情况,因此,内向分析方法的出现使得循环边界的分析技术更为完整有效。
[0005]符号执行技术是一种利用计算机以符号推导的方式来模拟系统执行的应用技术,它最早由James King于1976年应用于系统测试领域。该技术的核心思想在于,首先将系统输入的具体值用可以代表任意值的“符号”代替,并以此构建符号状态在特定的平台上进行模拟执行;然后通过收集系统各路径上关于符号值的约束条件,来获得各执行路径与系统输入符号的对应关系;最终通过求解约束条件来获得测试用例。由于传统符号执行方法的目的在于提高测试的覆盖率,因而其主要的关注点在于如何使符号执行尽可能地进入系统的各条不同路径上,而循环边界分析仅仅关注系统中的循环部分。针对这一问题,本发明对传统的符号执行技术进行了改进,使其符号推导的执行过程仅针对循环的最大迭代路径,从而能高效地完成循环边界的内向分析。
【发明内容】
[0006]技术问题:本发明的目的是提出一种实时系统循环边界的内向分析方法,该方法作为传统循环边界外向分析方法的必要补充,能保证所求得的循环边界估计值一定可达。
[0007]技术方案:本发明基于符号执行技术提出了一种循环边界的内向分析方法。该方法结合静态分析技术和动态符号执行方法,且在符号执行过程中改变搜索方式而使得执行引擎能够快速定位到各循环的最大迭代路径,并以此为基础高效地获得循环边界的估计值,本方法包含的具体步骤为:
[0008]1-1)、使用静态分析方法定位系统中的循环块,并将所定位到的循环块信息缓存,以便后续的符号执行进行进一步处理,在实现循环定位的过程中,缓存各循环块的起始位置点、入口数、出口数、各入口和出口的位置点、循环条件的基本信息,以便后续步骤使用;
[0009]1-2)、将当前待分析的实时系统编译到符号执行平台,以获得待分析系统在符号执行平台上的字节码,直接使用已有的符号化平台的配套编译工具,所生成的执行码将用于步骤1-3)的符号执行;
[0010]1-3)、在针对循环分析定制的目标制导引擎上,对步骤1-2)所生成的字节码完成符号执行,并在执行过程中比对由步骤1-1)所保存的循环块信息,针对特定路径进行符号推导,从而迅速获得各循环块边界的内向分析结果。
[0011]所述步骤1-3)中的符号执行方法针对循环边界分析的要求改变了搜索方式,从而使得执行引擎能够快速定位到系统中各循环的最大迭代路径;该方法具有两个执行模式——模式a和模式b,模式a的主要作用在于建立状态池,以获得系统中各循环的入口符号状态,而模式b的作用在于为已经具备条件的循环块计算内向边界;具体如下:
[0012]2-1)将引擎的初始模式置为模式a,构建系统的初始符号状态;在初始的符号状态中,系统输入由具体变量值改成了可以代表任意值的“符号”;
[0013]2-2)以模式a对系统执行码进行符号执行,并在执行过程中比对步骤1-1)缓存的循环块信息,当发现当前的符号状态到达循环入口时,将该状态加入循环内部状态集S留待模式b处理,而选择另一个符号状态执行;如果没有其它符号状态,则切换到模式b进行循环块边界分析;
[0014]2-3)切换到模式b以后,引擎会从循环内部状态集S中任取一个状态开始,具体分析每一个循环块的内向边界;这一模式的符号执行被约束在程序的各个循环块内,通过一系列符号制导求解过程,最终获得各个循环块的内向边界以及各循环块的出口状态;
[0015]2-4)当步骤2-3)完成时,引擎会得到一个完整循环块的内向边界值,以及该循环块的出口符号状态,这时引擎将切换回到模式a,以循环块出口状态开始继续寻找新的循环块,直到当前系统的所有符号状态都运行完成,即步骤2-2)中循环内部状态集S为空集,则求解各记录的符号状态约束,获得能覆盖对应路径的输入值等最终结果。
[0016]步骤2-3)切换到具体模式b以后,引擎将切换到一个循环块内的符号状态上执行;在该模式下,每一个符号状态将会维护一个信息栈I,用以存放多层嵌套循环的信息;当遇到嵌套循环时,外层循环的信息被压栈到I,并开始分析内层循环的信息;当内层循环分析完成后,外层循环的信息会从I出栈,从而可以继续进行外层循环的分析;在执行步骤2-3)时,平台会为当前所分析的循环块分配两个符号状态集——S和S’:状态集S用于缓存当前在循环内部等待执行的符号状态,而状态集S’用于缓存已经执行到当前循环出口的符号状态;在刚切换到模式b时,由于仅有一个符号状态在当前循环块内执行,故而S中仅有该符号状态,而S’初始时为空集;符号执行平台每次从S中取出一个符号状态并往前执行一步,并处理以下四种不同的具体情形:
[0017]当遇到分支时,会产生新的状态,新状态与当前状态会拥有同样的信息栈I,并且会被加入到状态集S中;
[0018]当进入内层的嵌套循环时,S与S’会被压入信息栈I中,平台为当前内层循环重建新的S与S’,S的初值为当前状态,s’的初值为空集;
[0019]当到达诸如程序中的break语句所标识的循环额外出口分支时,平台会求解当前符号状态内的符号信息,并将解得继续在循环内执行分支上的符号状态与沿循环出口运行的符号状态,将其分别加入S与S,,并进行循环出口处理,统计循环的内向边界值,并判断集合S是否为空集与信息栈I是否已到达栈底,如仍未到达栈底则表示当前循环为嵌套循环的内层循环,将执行信息栈I的出栈操作以便继续进行嵌套循环的外层循环分析;
[0020]当符号执行到达循环条件时,说明当前的循环经过了完整的一轮迭代执行,需将符号状态上所标注的迭代次数加1,将继续在循环内运行的符号状态加入S,离开循环的状态加入S’,并进行循环出口处理,以判断当前循环是否完成,并统计当前所在循环的内向边界值。
[0021]有益效果:本发明所述的实时系统循环边界的内向分析方法,从保障可达性的角度来分析实时系统的循环边界,它将实时系统代码直接编译到定制的符号执行引擎上,通过针对循环块路径制导的符号执行来自动高效地完成循环边界的分析。由于符号执行中的每一个状态都能解得一个具体的系统输入来覆盖该状态的执行路径,且解得的分析结果必然对应一个符号状态,故而所得的循环边界估计一定能够被实际的系统执行达到。具体来说,本发明所述的方法具有如下的有益效果:
[0022]1.)本发明所提供的循环边界内向分析方法,能够保障分析结果的可达性,从而能用于时间变化影响分析等针对实时系统的特定分析需求。另外,作为一种循环边界分析方法的补充技术,本发明使得循环边界分析方法更为完整有效。
[0023]2.)本发明所提供的分析方法是全自动的,分析过程不需要任何手工的干预。在分析完成时,本方法能给出用于结果验证的测试用例。用户在原始系统上使用该测试用例运行,即可验证所得到的循环边界的可达性。
[0024]3.)本发明在已有的符号执行技术基础上,构建了目标制导技术来完成循环边界的内向分析。该技术继承了符号执行的现有优势,能以单次执行来覆盖多条执行路径,从而避免了用例生成与系统的反复执行,并能达到较高的路径覆盖率。
[0025]4.)本发明所提出的方法具有高效性。由于本发明引入了路径制导特性来分析循环,使得符号执行中不需要执行的路径得到自动地裁剪,因而能够快速地定位到求解循环边界的关键路径,高效地完成分析。另外,本发明的符号执行引擎会及时合并在系统执行过程中因分化而产生的符号状态,从而有效地抑制了符号状态的组合爆炸,使得本方法能直接应用于大规模实时系统。
【专利附图】
【附图说明】
[0026]图1为循环边界内向分析的总流程。
[0027]图2为针对循环边界分析的目标制导符号执行流程。
[0028]图3为进入模式b以后符号制导求解循环块边界的流程。
【具体实施方式】
[0029]本发明的实时系统的循环边界内向分析方法结合静态分析技术和动态符号执行方法,且在符号执行过程中改变搜索方式而使得执行引擎能够快速定位到各循环的最大迭代路径,并以此为基础高效地获得循环边界的估计值。
[0030]本发明从保障可达性的角度提出了一种循环边界的内向分析方法,图1给出了该分析方法的具体流程,即先通过静态分析从源代码定位到实时系统中的循环块,并将循环块信息暂存到文件;然后通过符号编译将待分析系统转换成执行码;最终通过目标制导的分析引擎获得分析结果。具体的实施过程可以利用已有的控制流图构建工具、静态分析工具、符号执行引擎等软件基础设施。以下部分就实施过程中的一些具体细节作更进一步的描述:
[0031]一、循环块的定位算法
[0032]虽然从理论上说,已有的循环块定位算法都可用于完成本方法的步骤1,但基于支配图的图论算法在处理具备一般性的不可规约循环方面更具有优势,故而在实际实施中,本发明采用了这一算法来完成循环定位。
[0033]在实施该算法时,控制流图构建工具将根据系统的源代码构建出完整的控制流图。图中每一个节点代表了源代码中的一步操作,有向边代表了各操作执行的次序关系。当从控制流图的入口节点到达节点η的每一条路径都必经过节点d时,我们称节点d支配节点n,记为d dom η。可以证明,若控制流图的某一个深度优先生成树的某一条回边的目标节点支配其源节点,则此边在当前控制流图的任意深度优先生成树中都为回边,并且由这条回边可以确定一个自然循环块。该循环块包括节点d以及所有存在不通过节点d到达节点η的路径的节点。这样,基于支配图的图论算法将循环检测问题化归到了支配节点的检测问题。具体的算法描述如下:
[0034]输入:控制流图g,其内容包括节点集N,有向边集Ε,以及入口节点nQ
[0035]输出:循环块集L
[0036]1、构建初始的支配关系dom:支配关系dom是一个_■兀关系,其自变量为控制流图中的节点,应变量为节点集。初始的支配关系dom中,将节点Iltl映射到{%},其他g中的节点则映射到节点集N。
[0037]2、迭代求解完整的支配关系dom:遍历节点集N-{%}中各节点Iii,如果图g中存在有向边Oi^ni),则支配关系(1n^fni映射到节点集{nj U dom (rij);如果某次迭代过程修改了支配关系dom,则重新对各节点进行遍历,直到dom关系不再有变化为止。
[0038]3、由支配关系dom构建循环块集L:如在控制流图g中存在一条路径Ii1, n2。。。nk,且满足nk在domOi1)中,贝U必存在一个循环块1,I中包含节点叫、nk以及控制流图g中所有能不经过节点nk而到达Ii1的节点。当前算法仅需要遍历支配关系dom,匹配各节点在控制流图g中的可达性信息,即可将当前系统中的所有循环块加入循环块集L。
[0039]二、符号执行的执行码动静态匹配方法
[0040]本发明求解循环边界的重点在于符号执行模块,而当符号编译将待分析系统转换成执行码之后,源代码的结构信息并不在执行码内。因此,符号执行引擎需要一个机制来判断当前执行的符号指令处于所处的位置,以便其匹配循环定位模块的缓存信息,并分析当前指令处于哪个循环块内。
[0041]在本发明的实施中,我们利用了编译器输出的调试映射信息来完成这一匹配功能。大多数编译器在编译源代码的时候,除了生成用于机器执行的执行码,还会附带生成调试信息,这些信息包含了执行码里各个变量的地址映射,以及执行码指令对应于源代码的行号等。符号执行引擎通过比对执行码的调试信息和循环定位的缓存信息,即可分析获得当前指令所处的位置,并以此作为判断当前指令是否到达某循环块的循环条件、是否到达嵌套循环的入口、以及是否到达循环出口等的判别依据。
[0042] 由于本方法求得的循环边界估计值能解得对应路径的输入值,因此,本方法能保证所得循环边界值的可达性。即一定存在某一次系统执行能够达到当前求得的最大循环迭代次数,故而本方法为循环边界的内向分析方法。
【权利要求】
1.一种实时系统的循环边界内向分析方法,其特征在于该方法结合静态分析技术和动态符号执行方法,且在符号执行过程中改变搜索方式而使得执行引擎能够快速定位到各循环的最大迭代路径,并以此为基础高效地获得循环边界的估计值,本方法包含的具体步骤为: 1-1)、使用静态分析方法定位系统中的循环块,并将所定位到的循环块信息缓存,以便后续的符号执行进行进一步处理,在实现循环定位的过程中,缓存各循环块的起始位置点、入口数、出口数、各入口和出口的位置点、循环条件的基本信息,以便后续步骤使用; 1-2)、将当前待分析的实时系统编译到符号执行平台,以获得待分析系统在符号执行平台上的字节码,直接使用已有的符号化平台的配套编译工具,所生成的执行码将用于步骤1-3)的符号执行; 1-3)、在针对循环分析定制的目标制导引擎上,对步骤1-2)所生成的字节码完成符号执行,并在执行过程中比对由步骤1-1)所保存的循环块信息,针对特定路径进行符号推导,从而迅速获得各循环块边界的内向分析结果。
2.根据权利要求1所述的一种实时系统的循环边界内向分析方法,其特征在于所述步骤1-3)中的符号执行方法针对循环边界分析的要求改变了搜索方式,从而使得执行引擎能够快速定位到系统中各循环的最大迭代路径;该方法具有两个执行模式——模式a和模式b,模式a的主要作用在于建立状态池,以获得系统中各循环的入口符号状态,而模式b的作用在于为已经具备条件的循环块计算内向边界;具体如下: 2-1)将引擎的初始模式置为模式a,构建系统的初始符号状态;在初始的符号状态中,系统输入由具体变量值改成了可以代表任意值的“符号”; 2-2)以模式a对系统执行码进行符号执行,并在执行过程中比对步骤1-1)缓存的循环块信息,当发现当前的符号状态到达循环入口时,将该状态加入循环内部状态集S留待模式b处理,而选择另一个符号状态执行;如果没有其它符号状态,则切换到模式b进行循环块边界分析; 2-3)切换到模式b以后,引擎会从循环内部状态集S中任取一个状态开始,具体分析每一个循环块的内向边界;这一模式的符号执行被约束在程序的各个循环块内,通过一系列符号制导求解过程,最终获得各个循环块的内向边界以及各循环块的出口状态; 2-4)当步骤2-3)完成时,引擎会得到一个完整循环块的内向边界值,以及该循环块的出口符号状态,这时引擎将切换回到模式a,以循环块出口状态开始继续寻找新的循环块,直到当前系统的所有符号状态都运行完成,即步骤2-2)中循环内部状态集S为空集,则求解各记录的符号状态约束,获得能覆盖对应路径的输入值等最终结果。
3.根据权利要求2所述的一种实时系统的循环边界内向分析方法,其特征在于步骤2-3)切换到具体模式b以后,引擎将切换到一个循环块内的符号状态上执行;在该模式下,每一个符号状态将会维护一个信息栈I,用以存放多层嵌套循环的信息;当遇到嵌套循环时,外层循环的信息被压栈到I,并开始分析内层循环的信息;当内层循环分析完成后,夕卜层循环的信息会从I出栈,从而可以继续进行外层循环的分析;在执行步骤2-3)时,平台会为当前所分析的循环块分配两个符号状态集——S和S’:状态集S用于缓存当前在循环内部等待执行的符号状态,而状态集S’用于缓存已经执行到当前循环出口的符号状态;在刚切换到模式b时,由于仅有一个符号状态在当前循环块内执行,故而S中仅有该符号状态,而s’初始时为空集;符号执行平台每次从S中取出一个符号状态并往前执行一步,并处理以下四种不同的具体情形: 当遇到分支时,会产生新的状态,新状态与当前状态会拥有同样的信息栈I,并且会被加入到状态集S中; 当进入内层的嵌套循环时,S与S’会被压入信息栈I中,平台为当前内层循环重建新的S与S’,S的初值为当前状态,s’的初值为空集; 当到达诸如程序中的break语句所标识的循环额外出口分支时,平台会求解当前符号状态内的符号信息,并将解得继续在循环内执行分支上的符号状态与沿循环出口运行的符号状态,将其分别加入S与S’,并进行循环出口处理,统计循环的内向边界值,并判断集合S是否为空集与信息栈I是否已到达栈底,如仍未到达栈底则表示当前循环为嵌套循环的内层循环,将执行信息栈I的出栈操作以便继续进行嵌套循环的外层循环分析; 当符号执行到达循环条件时,说明当前的循环经过了完整的一轮迭代执行,需将符号状态上所标注的迭代次数加1,将继续在循环内运行的符号状态加入S,离开循环的状态加入S’,并进行循环出口处理,以判断当前循环是否完成,并统计当前所在循环的内向边界值。
【文档编号】G06F9/44GK104317572SQ201410520726
【公开日】2015年1月28日 申请日期:2014年9月30日 优先权日:2014年9月30日
【发明者】汤恩义, 鲍铁匀, 李宣东, 王林章, 陈鑫, 潘敏学 申请人:南京大学