主权项 |
一种基于控制流分析和数据流分析的Java程序静态分析方法,包括:(1)使用开源工具Soot,将Java源程序转化为Jimple语言的中间表示形式,并对中间表示形式进行数据结构的拆分,建立抽象语法树,生成控制流图;(2)将Java程序静态分析问题抽象为过程间分布式子集问题IFDS,并以过程间分布式子集问题IFDS求解器的方式表示该过程间分布式子集问题IFDS;(3)定义过程间分布式子集问题IFDS求解器的接口类:3a)规定过程间分布式子集问题IFDS求解器接口类参数的形式,即用字母N表示节点参数,用字母D表示数据参数,用字母M表示方法参数,用字母V表示值参数,用字母G表示控制流图参数;3b)规定过程间分布式子集问题IFDS求解器的类接口的名称为:IFDSSlover<N,D,M,V,G>;3c)规定过程间分布式子集问题IFDS求解器的类接口IFDSSlover<N,D,M,V,G>中包含有如下四个功能函数:数据流函数FlowFunctions<N,D,M>,控制流图函数interproceduralCFG(),初始化种子函数initialSeeds(),零值表示函数zeroValue();(4)在数据流函数FlowFunctions<N,D,M>中设置数据流分析规则:4a)规定控制流图上节点的类型包括:普通节点,调用节点及返回节点;4b)根据节点的类型规定节点之间边的类型:若当前节点为普通节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为普通边;若当前节点为调用节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为调用边;若当前节点为返回节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为返回边;若当前节点为调用节点,且当前节点的下一个节点为返回节点,则规定这两个节点之间边的类型为调用返回边;4c)根据边的类型确定边上数据流分析的不同操作规程:对于普通边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前普通节点的下一个普通节点;对于调用边的操作是:先执行对应的控制流图边上的程序,再以变量名称替换和数据等量赋值的方式,将当前节点的数据传递给当前调用节点的下一个普通节点;对于返回边的操作是:先执行对应的控制流图边上的程序,再以变量名称替回和数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前返回节点的下一个普通节点;对于调用返回边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给返回节点。(5)运行过程间分布式子集问题IFDS求解器接口类IFDSSlover<N,D,M,V,G>,在控制流图的基础上进行数据流分析:5a)将控制流图传递给过程间分布式子集问题IFDS求解器接口类IFDSSlover<N,D,M,V,G>中的控制流图参数G,再通过控制流图参数G将控制流图填充到控制流图函数interproceduralCFG()中;5b)初始化种子函数initialSeeds(),即以控制流图的第一个节点为起始节点,生成初始化种子,从初始化种子节点开始按照控制流图的执行逻辑,应用数据流分析规则,进行数据流分析;5c)执行(4)数据流规则,根据步骤4c)数据流操作规程中的数据传递方式,确定具体的值传递操作方式:若传递方式为数据等量赋值,则直接将该值传递给下一个节点;若传递方式为数据空值截流,则先调用零值表示函数zeroValue()将空值转化为空值符号NULL,再将该空值符号NULL传递给下一个节点;5d)判断当前节点传递给下一个节点是否成功:若当前节点的下一个节点正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点成功,跳转到步骤5e);若当前节点的下一个节点不能正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点失败,退出数据流分析;5e)判断当前节点的下一个节点是否为最后一个节点:若当前节点的下一个节点不是最后一个节点,则从当前节点的下一个节点开始,返回5c);若果当前节点的下一个节点是最后一个节点,则数据流分析完成,输出最终结果。 |