一种基于符号化函数摘要的静态分析方法及系统的制作方法

文档序号:6517784阅读:159来源:国知局
一种基于符号化函数摘要的静态分析方法及系统的制作方法
【专利摘要】本发明公开了一种基于符号化函数摘要的静态分析方法,该方法包括:利用RSTVL模型,描述当前函数的控制流图的节点的变量的存储状态;确定函数的当前节点为非最后节点且当前节点存在函数调用时,将被当前函数调用的函数的函数摘要进行实例化,并更新当前函数中受函数调用影响的变量;确定函数的当前节点为最后节点且确定当前函数具有函数返回值时,获得所述函数返回值的符号表达式,查找出存储状态发生变化的变量,并获取存储状态发生变化的变量的符号表达式;将所述函数返回值的符号表达式与存储状态发生变化的变量中的外部变量的符号表达式添加到当前函数的函数摘要中;同时,本发明还公开了基于符号化函数摘要的静态分析系统。利用本发明实施例的技术方案,可有效提高静态分析的精度效率。
【专利说明】一种基于符号化函数摘要的静态分析方法及系统【技术领域】
[0001]本发明涉及到静态分析技术,具体涉及到基于符号化函数摘要的静态分析方法及系统。
【背景技术】
[0002]通过对软件程序进行测试可以发现程序自身的不足与缺陷。其中,软件测试方法包括:静态分析及动态分析方法。
[0003]静态分析方法也称为静态测试,指的是不实际运行被测软件,而是通过对源程序的扫描发现可能导致程序的结构异常、控制流异常及数据流异常等情况。由此可见,对程序进行静态测试是保证软件质量的一个重要环节。同时,由于静态分析方法具有成本低、实现简单、可覆盖所有路径等优势而备受青睐。
[0004]分析精确度与分析效率是评价静态分析方法的两个重要指标。目前的过程间静态分析方法包括:过程内联、记录函数调用串、函数摘要等;其中,基于函数摘要的静态分析方法能够实现对程序上下文的敏感分析,但是由于程序中通常含有较多的多级指针变量、复合变量等复杂的数据类型变量,导致了分析精度与分析效率均不够高。

【发明内容】

[0005]有鉴于此,本发明实施例的主要目的在于提供一种基于符号化函数摘要的静态分析方法及系统,能够提高静态分析的精度及效率。
[0006]为达到上述目的,本发明实施例的技术方案是这样实现的:
[0007]本发明实施例提供了一种基于符号化函数摘要的静态分析方法,所述方法包括:
[0008]利用基于区域的符号化三值逻辑RSTVL模型,描述当前函数的控制流图的节点的变量的存储状态;
[0009]依据所述控制流图,确定所述函数的当前节点为非最后节点且所述当前节点存在函数调用时,将被当前函数调用的函数的函数摘要进行实例化,并更新所述RSTVL模型中受函数调用影响的变量;
[0010]确定所述函数的当前节点为最后节点且确定所述当前节点具有函数返回值时,获取所述函数返回值的符号表达式;查找出存储状态发生变化的变量,并获取存储状态发生变化的变量的符号表达式;将所述函数返回值的符号表达式与存储状态发生变化的变量中的外部变量的符号表达式添加到当前函数的函数摘要中。
[0011]上述方案中,所述利用基于区域的符号化三值逻辑RSTVL模型,描述当前函数的控制流图的节点的变量的存储状态,包括:
[0012]对所述当前函数的参数及所述当前函数使用的全局变量生成扩充变量;
[0013]利用所述RSTVL模型,描述所述当前函数的参数及所述全局变量分别占用的内存区域、分别对应的符号表达式、以及各自的取值区间;
[0014]将所述当前函数的参数及所述全局变量的扩充变量分别占用的内存区域、分别对应的符号表达式、以及各自的取值区间描述为变量的存储状态。
[0015]上述方案中,所述对当前函数的参数及所使用的全局变量生成扩充变量,包括:
[0016]基于定义-使用链,识别出被所述当前函数使用的全局变量,所述全局变量为复合类型时,扩充出所述全局变量的每个成员变量;全局变量为指针类型时,扩充出所述全局变量的每一级指针变量;
[0017]所述当前函数的参数为复合类型时,扩充出所述参数的每个成员变量,所述参数为指针类型时,扩充出所述参数的每一级指针变量。
[0018]上述方案中,在所述将被当前函数调用的函数的函数摘要进行实例化之前,所述方法还包括:
[0019]生成所述被当前函数调用的函数的函数摘要。
[0020]上述方案中,所述生成所述被当前函数调用的函数的函数摘要,包括:
[0021]将所述被当前函数调用的函数作为被调用函数;
[0022]基于所述被调函数的RSTVL模型,获取所述被调函数的参数的符号表达式、全局变量的符号表达式;
[0023]确定由所述被调函数指针类型的参数扩充出的变量在所述被调函数的函数出口处及函数入口处不一致时,将所述扩充变量及其对应的符号表达式添加到所述被调函数的函数摘要中;
[0024]确定所述全局变量的取值区间在所述被调函数的函数出口处及函数入口处不一致时,将所述全局变量及其对应的符号表达式添加到所述被调函数的函数摘要中;
[0025]所述被调函数存在有函数返回值时,依据所述RSTVL模型,获取所述函数返回值的符号表达式,并将所述符号表达式添加到所述函数摘要中。
[0026]上述方案中,所述方法还包括:
[0027]对于所述被调用函数的参数、全局变量、函数返回值的符号表达式中的每个符号,获取所述符号的取值区间;
[0028]当该取值区间类型为指针类型时,且该指针类型区间的指向集合中存在有区域编号标识的区域是局部变量的区域时,将该区域编号替换为表示野指针的区域编号;指针类型区间的指向集合中未存在区域编号标识的区域是局部变量的区域时,将该指针类型区间的指向集合中的区域编号与具有该区域编号的区域所对应的变量添加到函数摘要中;
[0029]当该取值区间类型为非指针类型时,获取所述符号对应的变量;所述符号对应的变量为局部变量时,将所述符号与所述符号的取值区间添加到函数摘要中;所述符号对应的变量为非局部变量时,将所述符号与所述符号对应的变量添加到函数摘要中。
[0030]上述方案中,所述将被当前函数调用的函数的函数摘要进行实例化,包括:
[0031]基于所述当前函数在函数调用点处的上下文环境,获取所述被当前函数调用的函数的形参与所述当前函数的实参之间的对应关系;
[0032]获得实参对应的符号表达式,并依据所述对应关系,将实参对应的符号表达式替换形参的符号表达式中的符号。
[0033]上述方案中,所述获取所述被当前函数调用的函数的形参与所述当前函数的实参之间的对应关系,包括:
[0034]当所述被当前函数调用的函数的形参有父变量时,获取所述父变量对应的实参,并依据所述形参的表达式类型与所述父变量对应的实参,获取所述形参对应的实参;
[0035]当所述被当前函数调用的函数的形参没有父变量时,依据所述当前函数与所述被当前函数调用的函数之间的变量对应关系,确定与所述形参对应的实参。
[0036]上述方案中,所述方法还包括:
[0037]在所述RSTVL模型中,当函数返回值由符号表达式来描述时,获得符号化表达式中的每一个符号,所述符号对应于所述当前函数的变量时,获得所述符号对应的变量,基于形参与实参的对应关系,获得该变量对应的实参,根据所述当前函数在调用点的上下文环境,获得该实参对应的符号表达式,用实参对应的符号表达式替换形参的符号表达式中的符号;
[0038]所述符号对应于所述被当前函数调用的函数的局部变量生成的符号,从所述被当前函数调用的函数的函数摘要中获取所述符号对应的取值区间,该取值区间为指针类型区间时,基于所述函数摘要对指针类型区间的指向集合进行实例化。
[0039]上述方案中,所述方法还包括:
[0040]当所述当前函数的函数返回值由取值区间标识,且当所述取值区间为指针类型区间时,对该指针类型区间的指向集合进行实例化。
[0041]本发明实施例还提供了一种基于符号化函数摘要的静态分析系统,所述系统包括:
[0042]描述单元,用于利用基于区域的符号化三值逻辑RSTVL模型,描述当前函数的控制流图的节点的变量的存储状态;
[0043]第一实例化单元,用于依据所述控制流图,确定所述函数的当前节点为当前函数的非最后节点且所述当前节点存在函数调用,将被当前函数调用的函数的函数摘要进行实例化,并更新所述RSTVL模型中受函数调用影响的变量;
[0044]第二实例化单元,用于所述函数的当前节点为当前函数的最后节点且确定所述当前节点具有函数返回值时,获取所述函数返回值的符号表达式,查找出存储状态发生变化的变量,并获取存储状态发生变化的变量的符号表达式;将所述函数返回值的符号表达式与存储状态发生变化的变量中的外部变量的符号表达式添加到当前函数的函数摘要中。
[0045]上述方案中,所述系统还包括:
[0046]生成单元,用于生成所述被当前函数调用的函数的函数摘要。
[0047]上述方案中,所述生成单元,还用于:
[0048]将所述被当前函数调用的函数作为被调函数;
[0049]基于所述被调函数的RSTVL模型,获取所述被调函数的参数的符号表达式、全局变量的符号表达式;
[0050]确定由所述被调函数指针类型的参数扩充出的变量的存储状态在所述被调函数的函数出口处及函数入口处不一致时,将所述扩充变量及其对应的符号表达式添加到所述被调函数的函数摘要中;
[0051]确定所述全局变量的取值区间在所述被调函数的函数出口处及函数入口处不一致时,将所述全局变量及其对应的符号表达式添加到所述被调函数的函数摘要中;
[0052]所述被调函数存在有函数返回值时,依据所述RSTVL模型,获取所述函数返回值的符号表达式,并将所述符号表达式添加到所述函数摘要中。[0053]本发明实施例提供了一种基于符号化函数摘要的静态分析方法及系统,利用基于区域的符号化三值逻辑(RSTVL, Region-based Symbolic Three Value Logic)模型,描述当前函数的控制流图的节点的变量的存储状态;确定所述函数的当前节点为当前函数的非最后节点且所述当前节点存在函数调用时,将被当前函数调用的函数的函数摘要进行实例化,并更新当前函数中受函数调用影响的所述变量;确定所述函数的当前节点为当前函数的最后节点且确定所述当前函数具有函数返回值时,获得所述函数返回值的符号表达式,查找出存储状态发生变化的变量,并获取存储状态发生变化的变量的符号表达式;将所述函数返回值的符号表达式与存储状态发生变化的变量中的外部变量的符号表达式添加到当前函数的函数摘要中。利用本发明实施例的技术方案,可有效提高静态分析的精度与效率。
【专利附图】

【附图说明】
[0054]图1为本发明实施例的基于符号化函数摘要的静态分析方法的实现流程示意图;
[0055]图2为本发明实施例的基于符号化函数摘要的静态分析方法的一具体实现流程示意图;
[0056]图3为本发明实施例的外部变量生成扩充变量的实现流程不意图;
[0057]图4为本发明实施例的对函数摘要进行实例化的实现流程示意图;
[0058]图5为本发明实施例的获取函数摘要中每个形参及其扩充变量分别对应的实参的实现流程示意图;
[0059]图6为本发明实施例的将获取到的父变量按照父子关系排序形成父变量集合的实现流程示意图;
[0060]图7为本发明实施例的根据形参的表达式类型及该形参的父变量对应的实参获得该形参对应的实参的实现流程示意图;
[0061]图8为本发明实施例的更新受函数调用的副作用影响的变量的实现流程示意图;
[0062]图9为本发明实施例的计算函数返回值的实现流程示意图;
[0063]图10为本发明实施例的计算函数副作用的实现流程示意图;
[0064]图11为本发明实施例的将符号表达式的相关辅助信息添加到函数摘要的实现流程不意图;
[0065]图12为本发明实施例的基于符号化函数摘要的静态分析系统的组成结构示意图。
【具体实施方式】
[0066]本发明实施例提供了一种基于符号化函数摘要的静态分析方法,如图1所示,所述方法包括:
[0067]步骤10:利用RSTVL模型,描述当前函数的控制流图的节点的变量的存储状态;
[0068]本发明实施例中,用RSTVL的四元组模型来描述变量的存储状态,具体请参见后续技术方案的说明。
[0069]步骤11:确定所述函数的当前节点为当前函数的非最后节点且所述当前节点存在函数调用时,将被当前函数调用的函数的函数摘要进行实例化,并更新当前函数中受函数调用影响的所述变量。
[0070]这里,对于受函数调用影响的变量可以视为受函数调用副作用影响的变量。
[0071]步骤12:确定所述函数的当前节点为当前函数的最后节点且确定所述当前函数具有函数返回值时,获得所述函数返回值的符号表达式,查找出存储状态发生变化的变量,并获取存储状态发生变化的变量的符号表达式;将所述函数返回值的符号表达式与存储状态发生变化的变量中的外部变量的符号表达式添加到当前函数的函数摘要中。
[0072]下面结合图2?图11对本发明实施例的技术方案进行进一步的说明。
[0073]这里,程序文件中将记载有至少一个函数,依据实际情况,每个函数在程序文件中都将可以作为主调函数,也可能作为被调函数;所以,本发明实施例提出的上述方法适用于程序文件中记载的所有函数。
[0074]如图2为本发明实施例的基于符号化函数摘要的静态分析方法的一具体实现流程不意图,如图2所不:
[0075]步骤A:在当前函数的入口处,对当前函数的参数、使用的全局变量生成扩充变量,并初始化上述变量;
[0076]本发明实施例中,将函数的变量划分为外部变量与局部变量;其中,所述外部变量包括:全局变量与函数参数。初始化过程为:为基本类型的变量生成符号及Region ;为非基本类型的变量创建Region。
[0077]步骤B:在当前函数的控制流图中选取当前节点;判断所述当前节点是否为当前函数的最后一个节点,如果是继续处理步骤H ;否则,继续处理步骤C ;
[0078]步骤C:判断当前节点是否存在函数调用,如果是继续处理步骤D,否则执行步骤G0
[0079]步骤D:获得被调函数的函数摘要,继续处理步骤E ;
[0080]本发明实施例中,称被当前函数调用的函数为被调函数;称当前函数为主调函数。
[0081]步骤E:依据所述当前函数调用点的上下文环境,对所述被调函数的函数摘要进行实例化,继续执行步骤F。
[0082]步骤F:对于函数摘要中的受函数调用的副作用影响的变量进行更新。
[0083]步骤G:利用RSTVL模型,对当前节点的变量的进行描述;继续执行步骤B。
[0084]本发明实施例中,用RSTVL的四元组模型来描述程序中的每个变量及变量的取值,该四元组模型为〈Var, Region, SExp, Domain);其中:元素Var表示程序中的一个变量;该变量包括有顶级变量和复合类型变量的成员变量;Region表示为该变量分配的抽象内存区域,由区域编号来标识;SExp表示与该变量有关的符号表达式;Domain表示该变量的取值区间;其中,在变量为指针类型变量时,该变量的取值区间也称为该变量的指向集合,该指向集合由该变量可能指向的其它变量的区域编号的集合构成。
[0085]简言之,利用RSTVL模型,描述参数及全局变量占用的内存区域、所对应的符号表达式以及取值区间;描述参数的扩充变量、全局变量的扩充变量占用的内存区域,所对应的符号表达式以及取值区间。
[0086]步骤H:判断当前函数是否具有函数返回值,如果是继续处理步骤I ;否则,继续处理步骤J ;
[0087]步骤1:获取当前函数的函数返回值的符号化表达式,并将所述符号表达式添加到当前函数的函数摘要中,继续执行步骤J;
[0088]步骤J:在当前函数的退出节点获取当前函数受函数调用的副作用影响的参数与全局变量,并将该参数与全局变量及其对应的符号表达式添加到当前函数的函数摘要中,当前处理流程结束。
[0089]图3为步骤A中为外部变量生成扩充变量的实现流程示意图;如图3所示:
[0090]步骤A.1:获取当前函数的全部全局变量,并添加到外部变量列表中;
[0091]步骤A.2:逐一提取添加到外部变量列表中的全局变量,判断是否还有未被提取的全局变量,如果有提取该未被提取的全局变量执行步骤A.3 ;否则执行步骤A.5 ;
[0092]步骤A.3:基于定义-使用链,识别全局变量是否被当前函数所使用,如果识别出被当前函数所使用执行步骤A.4 ;否则执行步骤A.2 ;
[0093]步骤A.4:为该全局变量生成扩充变量,并将该全局变量与其生成的扩充变量添加到外部变量列表中,执行步骤A.2 ;
[0094]步骤A.5:获得当前函数的所有形参,并添加到外部变量列表中;
[0095]步骤A.6:逐一提取添加到外部变量列表中的形参,判断是否还有未被提取的形参,如果有,则提取该未被提取的形参执行步骤A.7 ;否则,执行步骤A.8 ;
[0096]步骤A.7:为该形参生成扩充变量,并将该形参与生成的扩充变量添加到外部变量列表中,继续执行步骤A.6,直到所有形参被提取完;
[0097]步骤A.8:判断外部变量列表中是否还有未被初始化的外部变量,如果判断为有则提取出该未被初始化的外部变量并执行步骤A.9 ;否则,执行步骤A.12 ;
[0098]步骤A.9:判断该外部变量是否是基本类型的变量,如果是,则执行步骤A.10 ;否贝IJ,执行步骤A.11;
[0099]步骤A.10:为外部变量创建一个符号,继续进行步骤A.11 ;
[0100]步骤A.11:为外部变量创建抽象区域Region,并建立外部变量与其直接父变量的关联关系;继续执行步骤A.8,直至所有外部变量均被初始化,之后,执行步骤A.12。
[0101]这里,建立的直接关系为:建立外部变量与其直接父变量的关系。
[0102]步骤A.12:外部变量初始化结束。
[0103]图4为本发明实施例步骤E中对被调函数的函数摘要进行实例化的实现流程示意图,如图4所示:
[0104]步骤E.1:获取被调函数的函数摘要中每个形参及其扩充变量分别对应的实参;
[0105]步骤E.2:获取被调函数的函数摘要中的所有符号化表达式,并添加到符号化表达式列表中;
[0106]步骤E.3:逐一提取添加到符号化表达式列表中符号化表达式,判断是否还有未被实例化的符号化表达式,提取出该未被实例化的符号化表达式继续执行步骤E.4 ;否则,执行步骤E.10 ;
[0107]步骤E.4:逐一提取该符号表达式中的所有符号,继续执行步骤E.5 ;
[0108]步骤E.5:判断在该符号表达式中是否还有未被实例化的符号,如果有继续执行步骤E.6 ;否则继续执行步骤E.3 ;
[0109]步骤E.6:提取符号表达式中未被实例化的符号,继续执行步骤E.7 ;
[0110]步骤E.7:判断该未被实例化的符号在函数摘要中是否有其对应的变量,如果有执行步骤Ε.9 ;否则,执行步骤Ε.8 ;
[0111]步骤Ε.8:从函数摘要中查找该符号对应的区间,如果查找到的取值区间为指针类型的取值区间,则对取值区间的指向集合进行实例化,并将实例化后的取值区间添加到程序调用点的符号区间集合中;继续执行步骤Ε.5 ;
[0112]步骤Ε.9:在被调函数的函数摘要中,查找该符号所对应的变量,以及查找该变量对应的实参,根据程序调用点的上下文环境,获取实参对应的符号表达式,并用实参对应的符号表达式替换被实例化的符号表达式中的该符号;继续执行步骤Ε.5 ;
[0113]步骤Ε.10:被调函数的函数摘要实例化过程结束。
[0114]图5为步骤Ε.1中获取被调函数的函数摘要中每个形参及其扩充变量分别对应的实参的实现流程图;步骤Ε.1也可以看成是形参映射实参的过程。
[0115]如图5所示:
[0116]步骤Ε.1.1:从被调函数的函数摘要中获得所有形参及其扩充变量,并添加到形参列表;
[0117]这里,所述形参包括顶级形参。
[0118]步骤Ε.1.2:逐一提取添加到形参列表中的形参,判断是否还有未被提取的形参;如果有提取该未被提取的形参执行步骤Ε.1.3 ;否则,执行步骤Ε.1.11 ;
[0119]步骤Ε.1.3:获取该形参对应的直接父变量及间接父变量,并将获取到的父变量按照父子关系排序形成父变量集合,继续执行步骤Ε.1.4 ;
[0120]步骤Ε.1.4:逐一提取父变量集合中的形参变量,并判断父变量集合中是否还有未被提取的形参,如果有提取该形参继续执行步骤Ε.1.5 ;否则执行步骤Ε.1.2 ;
[0121]步骤Ε.1.5:判断该形参是否已是获取到了实参的变量,如果是,则执行步骤Ε.1.6 ;否则,执行步骤Ε.1.4 ;
[0122]步骤Ε.1.6:判断该形参变量是否有父变量,如果有,则执行步骤Ε.1.7 ;否则,执行步骤Ε.1.9 ;
[0123]步骤Ε.1.7:从形参实参映射集合中获得该形参的父变量所对应的实参,继续执行步骤Ε.1.8 ;
[0124]步骤Ε.1.8:根据该形参的表达式类型及该父变量对应的实参的类型,获得该形参对应的实参;
[0125]步骤Ε.1.9:;依据当前函数与被调函数之间的变量对应关系,获得与该形参对应的实参,继续执行步骤Ε.1.10 ;
[0126]步骤Ε.1.10:将该形参对应的实参添加到形参实参映射集合中,继续执行步骤Ε.1.4 ;
[0127]步骤Ε.1.11:形参映射实参的处理结束。
[0128]图6为步骤Ε.1.3中将获取到的父变量按照父子关系排序形成父变量集合的实现流程示意图,如图6所示:
[0129]步骤Ε.1.3.1:提取形参列表中的一个形参变量作为当前形参变量;
[0130]步骤Ε.1.3.2:判断当前形参变量是否形如*.exp,如果是,执行步骤Ε.1.3.6 ;否贝IJ,执行步骤E.1.3.3 ;
[0131]步骤E.1.3.3:判断当前形参变量是否形如exp.f,如果是,执行步骤E.1.3.6 ;否则,执行步骤Ε.1.3.4 ;
[0132]步骤Ε.1.3.4:判断当前形参变量是否形如exp [i],如果是,执行步骤Ε.1.3.6 ;否贝IJ,执行步骤E.1.3.5 ;
[0133]步骤E.1.3.5:判断当前形参变量是否形如(exp),如果是,执行步骤E.1.3.6 ;否贝IJ,执行步骤E.1.3.7 ;
[0134]步骤E.1.3.6:将名为exp的变量添加到父变量集合,并将exp作为当前形参变量,继续执行步骤E.1.3.2;
[0135]步骤E.1.3.7:对父变量集合中的变量按照父子关系排序,继续执行步骤
E.1.3.8 ;
[0136]步骤E.1.3.8:获取父变量集合处理结束。
[0137]图7为步骤E.1.8中根据形参的表达式类型及该形参的父变量对应的实参获得该形参对应的实参的实现流程示意图,如图7所示:
[0138]步骤E.1.8.1:提取形参列表中的一个形参变量作为当前形参变量;
[0139]步骤E.1.8.2:判断当前形参变量是否形如*.exp,如果是,执行步骤E.1.8.3 ;否贝IJ,执行步骤E.1.8.4 ;
[0140]步骤E.1.8.3:基于公式
【权利要求】
1.一种基于符号化函数摘要的静态分析方法,其特征在于,所述方法包括: 利用基于区域的符号化三值逻辑RSTVL模型,描述当前函数的控制流图的节点的变量的存储状态; 依据所述控制流图,确定所述函数的当前节点为非最后节点且所述当前节点存在函数调用时,将被当前函数调用的函数的函数摘要进行实例化,并更新所述RSTVL模型中受函数调用影响的变量; 确定所述函数的当前节点为最后节点且确定所述当前节点具有函数返回值时,获取所述函数返回值的符号表达式;查找出存储状态发生变化的变量,并获取存储状态发生变化的变量的符号表达式;将所述函数返回值的符号表达式与存储状态发生变化的变量中的外部变量的符号表达式添加到当前函数的函数摘要中。
2.根据权利要求1所述的符号化函数摘要的静态分析方法,其特征在于,所述利用基于区域的符号化三值逻辑RSTVL模型,描述当前函数的控制流图的节点的变量的存储状态,包括: 对所述当前函数的参数及所述当前函数使用的全局变量生成扩充变量; 利用所述RSTVL模型,描述所述当前函数的参数及所述全局变量分别占用的内存区域、分别对应的符号表达式、以及各自的取值区间; 将所述当前函数的参数及所述全局变量的扩充变量分别占用的内存区域、分别对应的符号表达式、以及各自的取值区间描述为变量的存储状态。
3.根据权利要求2所述符号化函数摘要的静态分析方法,其特征在于,所述对当前函数的参数及所使用的全局变量生成扩充变量,包括: 基于定义-使用链,识别出被所述当前函数使用的全局变量,所述全局变量为复合类型时,扩充出所述全局变量的每`个成员变量;全局变量为指针类型时,扩充出所述全局变量的每一级指针变量; 所述当前函数的参数为复合类型时,扩充出所述参数的每个成员变量,所述参数为指针类型时,扩充出所述参数的每一级指针变量。
4.根据权利要求1所述的符号化函数摘要的静态分析方法,其特征在于,在所述将被当前函数调用的函数的函数摘要进行实例化之前,所述方法还包括: 生成所述被当前函数调用的函数的函数摘要。
5.根据权利要求4所述的符号化函数摘要的静态分析方法,其特征在于,所述生成所述被当前函数调用的函数的函数摘要,包括: 将所述被当前函数调用的函数作为被调用函数; 基于所述被调函数的RSTVL模型,获取所述被调函数的参数的符号表达式、全局变量的符号表达式; 确定由所述被调函数指针类型的参数扩充出的变量在所述被调函数的函数出口处及函数入口处不一致时,将所述扩充变量及其对应的符号表达式添加到所述被调函数的函数摘要中; 确定所述全局变量的取值区间在所述被调函数的函数出口处及函数入口处不一致时,将所述全局变量及其对应的符号表达式添加到所述被调函数的函数摘要中; 所述被调函数存在有函数返回值时,依据所述RSTVL模型,获取所述函数返回值的符号表达式,并将所述符号表达式添加到所述函数摘要中。
6.根据权利要求5所述的符号化函数摘要的静态分析方法,其特征在于,所述方法还包括: 对于所述被调用函数的参数、全局变量、函数返回值的符号表达式中的每个符号,获取所述符号的取值区间; 当该取值区间类型为指针类型时,且该指针类型区间的指向集合中存在有区域编号标识的区域是局部变量的区域时,将该区域编号替换为表示野指针的区域编号;指针类型区间的指向集合中未存在区域编号标识的区域是局部变量的区域时,将该指针类型区间的指向集合中的区域编号与具有该区域编号的区域所对应的变量添加到函数摘要中; 当该取值区间类型为非指针类型时,获取所述符号对应的变量;所述符号对应的变量为局部变量时,将所述符号与所述符号的取值区间添加到函数摘要中;所述符号对应的变量为非局部变量时,将所述符号与所述符号对应的变量添加到函数摘要中。
7.根据权利要求1所述的符号化函数摘要的静态分析方法,其特征在于,所述将被当前函数调用的函数的函数摘要进行实例化,包括: 基于所述当前函数在函数调用点处的上下文环境,获取所述被当前函数调用的函数的形参与所述当前函数的实参之间的对应关系; 获得实参对应的符号表达式,并依据所述对应关系,将实参对应的符号表达式替换形参的符号表达式中的符号。
8.根据权利要求7所述的符号化函数摘要的静态分析方法,其特征在于,所述获取所述被当前函数调用的函数的形参与所述当前函数的实参之间的对应关系,包括: 当所述被当前函数调用的函数的形参有父变量时,获取所述父变量对应的实参,并依据所述形参的表达式类型与所述父变量对应的实参,获取所述形参对应的实参; 当所述被当前函数调用的函数的形参没有父变量时,依据所述当前函数与所述被当前函数调用的函数之间的变量对应关系,确定与所述形参对应的实参。
9.根据权利要求1所述的符号化函数摘要的静态分析方法,其特征在于,所述方法还包括: 在所述RSTVL模型中,当函数返回值由符号表达式来描述时,获得符号化表达式中的每一个符号,所述符号对应于所述当前函数的变量时,获得所述符号对应的变量,基于形参与实参的对应关系,获得该变量对应的实参,根据所述当前函数在调用点的上下文环境,获得该实参对应的符号表达式,用实参对应的符号表达式替换形参的符号表达式中的符号; 所述符号对应于所述被当前函数调用的函数的局部变量生成的符号,从所述被当前函数调用的函数的函数摘要中获取所述符号对应的取值区间,该取值区间为指针类型区间时,基于所述函数摘要对指针类型区间的指向集合进行实例化。
10.根据权利要求1或9所述的符号化函数摘要的静态分析方法,其特征在于,所述方法还包括: 当所述当前函数的函数返回值由取值区间标识,且当所述取值区间为指针类型区间时,对该指针类型区间的指向集合进行实例化。
11.一种基于符号化函数摘要的静态分析系统,其特征在于,所述系统包括: 描述单元,用于利用基于区域的符号化三值逻辑RSTVL模型,描述当前函数的控制流图的节点的变量的存储状态; 第一实例化单元,用于依据所述控制流图,确定所述函数的当前节点为当前函数的非最后节点且所述当前节点存在函数调用,将被当前函数调用的函数的函数摘要进行实例化,并更新所述RSTVL模型中受函数调用影响的变量; 第二实例化单元,用于所述函数的当前节点为当前函数的最后节点且确定所述当前节点具有函数返回值时,获取所述函数返回值的符号表达式,查找出存储状态发生变化的变量,并获取存储状态发生变化的变量的符号表达式;将所述函数返回值的符号表达式与存储状态发生变化的变量中的外部变量的符号表达式添加到当前函数的函数摘要中。
12.根据权利要求11所述的基于符号化函数摘要的静态分析系统,其特征在于,所述系统还包括: 生成单元,用于生成所述被当前函数调用的函数的函数摘要。
13.根据权利要求12所述的基于符号化函数摘要的静态分析系统,其特征在于,所述生成单元,还用于: 将所述被当前函数调用的函数作为被调函数; 基于所述被调函数的RSTVL模型,获取所述被调函数的参数的符号表达式、全局变量的符号表达式; 确定由所述被调函数指针类型的参数扩充出的变量的存储状态在所述被调函数的函数出口处及函数入口处不一致时,将所述扩充变量及其对应的符号表达式添加到所述被调函数的函数摘要中; 确定所述全局变量的取值区间在所述被调函数的函数出口处及函数入口处不一致时,将所述全局变量及其对应的符号表达式添加到所述被调函数的函数摘要中; 所述被调函数存在有函数返回值时,依据所述RSTVL模型,获取所述函数返回值的符号表达式,并将所述符号表达式添加到所述函数摘要中。
【文档编号】G06F11/36GK103744776SQ201310538362
【公开日】2014年4月23日 申请日期:2013年11月4日 优先权日:2013年11月4日
【发明者】宫云战, 金大海, 黄俊飞, 王雅文, 董玉坤 申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1