基于控制流分析和数据流分析的Java程序静态分析方法_2

文档序号:9844024阅读:来源:国知局
发明数据流分析规则定义流程图;
[0048]图4为本发明数据流分析过程流程图。
【具体实施方式】
[0049]下面结合附图对本发明作进一步的描述。
[0050]参照图1,本发明的实现步骤如下:
[0051 ]步骤I,将Java语言转化为Jimple语言。
[°°52]目前,Java语言的中间表示形式有很多种,包括:Baf,Shimple,Grimp和Jimple,其中Jimple语言是最接近Java字节码的中间表示形式,本实例使用当前唯一的中间语言转化工具Soot,将Java源码转换为Jimple语言的表示形式,接着基于Jimple语言数据规则的拆分,并按照程序的执行逻辑,建立抽象语法树,生成控制流图。
[0053]步骤2,将Java程序分析问题抽象为过程间分布式子集问题IFDS。
[0054]根据分布式子集问题IFDS的种类,将实际程序分析问题,转化为分布式子集问题,例如:程序分析问题是分析程序中是否含有未初始化变量,转化为分布式子集问题IFDS为是否存在一条数据流,这条数据流的起始点是未初始化变量,终结点是其它已初始化变量。
[0055]步骤3,定义过程间分布式子集的接口类。
[0056]参照图2,本步骤的具体实现如下:
[0057]3a)规定过程间分布式子集问题IFDS求解器接口类参数的形式,即用字母N表示节点参数,用字母D表示数据参数,用字母M表示方法参数,用字母V表示值参数,用字母G表示控制流图参数;
[0058]3b)规定过程间分布式子集问题IFDS求解器的类接口的名称为:iroSSl0Ver〈N,D,M,V,G>;
[0059]3c)规定过程间分布式子集问题IFDS求解器的类接口 IFDSSlover〈N,D,M,V,G>中包含有如下四个功能函数:数据流函数FlowFunc t i ons〈N,D,M>,控制流图函数interproceduralCFG(),初始化种子函数initialSeeds(),零值表不函数zeroValue()。
[0000] 步骤4,在数据流函数FlowFunct 1ns〈N,D,M>中,设置数据流分析规则。
[0061 ]参照图3,本步骤的具体实现如下:
[0062]4a)规定控制流图上节点的类型包括:普通节点,调用节点及返回节点;
[0063]4b)根据节点的类型规定节点之间边的类型:
[0064]若当前节点为普通节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为普通边;
[0065]若当前节点为调用节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为调用边;
[0066]若当前节点为返回节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为返回边;
[0067]若当前节点为调用节点,且当前节点的下一个节点为返回节点,则规定这两个节点之间边的类型为调用返回边;
[0068]4c)根据边的类型确定边上数据流分析的不同操作规程,包括四种操作规程:对于普通边的操作、对于调用边的操作、对于返回边的操作和对于调用返回边的操作;具体的操作规程如下:
[0069]4cl)对于普通边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前普通节点的下一个普通节点;
[0070]4c2)对于调用边的操作是:先执行对应的控制流图边上的程序,再以变量名称替换和数据等量赋值的方式,将当前节点的数据传递给当前调用节点的下一个普通节点;
[0071]4c3)对于返回边的操作是:先执行对应的控制流图边上的程序,再以变量名称替回和数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前返回节点的下一个普通节点;
[0072]4c4)对于调用返回边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给返回节点。
[0073]所述的数据等量赋值是:假设赋值的变量为X,被赋值的变量为y,按如下操作进行:
[0074]第I步,操作系统在内存中为变量X分配一块内存空间,在这块内存空间中存储着变量X的实际值;
[0075]第2步,将变量X赋值给变量y,操作系统在内存中不给变量y分配空间,直接将变量y指向变量X的内存空间;
[0076]第3步,变量X和变量y指向同一块内存空间,改变变量x的实际值,使变量y的实际值随着变量X的实际值的改变而改变,即变量X对变量y的数据等量赋值。
[0077]所述的数据空值截流是:假设赋值的变量为X,被赋值的变量为y,按如下的操作进行:
[0078]第一步,操作系统在内存中为变量X分配一块内存空间,在这块内存空间中存储着变量X的实际值;
[0079]第二步,将变量X赋值给变量y,操作系统在内存中不给变量y分配空间,直接将变量y指向变量X的内存空间;
[0080]第三步,将变量X的内存空间收回,变量X将不具有内存空间,即变量X为空值;
[0081]第四步,变量X和变量y指向同一块内存空间,变量X为空值,变量y也为空值,即变量X对变量y的数据空值截流。
[0082]步骤5,运行过程间分布式子集问题1?03求解器接口类正03310代^10 3,¥,6>,在控制流图的基础上进行数据流分析。
[0083]参照图4,本步骤的具体实现如下:
[0084]5a)将控制流图传递给过程间分布式子集问题IFDS求解器接口类IFDSSlover〈N,D,M,V,G>中的控制流图参数G,再通过控制流图参数G将控制流图填充到控制流图函数interproceduralCFG()中,其中通过控制流图参数G将控制流图填充到控制流图函数interproceduralCFG()中的步骤为:
[0085]5al)根据程序的执行逻辑,将控制流图节点中包含的数据以集合的形式传递给控制流图参数G;
[0086]5a2)调用控制流图函数interproceduralCFG()中的构造函数接收控制流图参数G,并对控制流图参数G进行拆分和自填充;
[0087]5b)初始化种子函数initialSeedsO,即以控制流图的第一个节点为起始节点,生成初始化种子,从初始化种子节点开始按照控制流图的执行逻辑,应用数据流分析规则,进行数据流分析;
[0088]5c)执行步骤4数据流规则,根据步骤4c)数据流操作规程中的数据传递方式,确定具体的值传递操作方式:
[0089]若传递方式为数据等量赋值,则直接将该值传递给下一个节点;
[0090]若传递方式为数据空值截流,则先调用零值表示函数zeroValueO将空值转化为空值符号NULL,再将该空值符号NULL传递给下一个节点;
[0091]5d)判断当前节点传递给下一个节点是否成功:
[0092]若当前节点的下一个节点正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点成功,跳转到步骤5e);
[0093]若当前节点的下一个节点不能正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点失败,退出数据流分析;
[0094]5e)判断当前节点的下一个节点是否为最后一个节点:
[0095]若当前节点的下一个节点不是最后一个节点,则从当前节点的下一个节点开始,返回5c);
[0096]若果当前节点的下一个节点是最后一个节点,则数据流分析完成,输出最终结果。
[0097]符号说明
[0098]Baf:基于栈的Java语言中间表示形式;
[0099]Jimple:三地址的基于语句的带类型的Java语言中间表示形式;
[0?00] Shimple:基于Jimple,在Jimple语言上添加了静态单点任务分配功能的Java语言中间表示形式;
[0101 ] Grimp:基于Jimple,在Jimple语言上添加了允许树形态表达和new指令的Java语言中间表示形式;
[0102]Soot: Java 到 Jimple 语言转化工具;
[0103]iros:过程间分布式子集问题;
[0104]N:1FDS求解器的节点参数;
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1