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

文档序号:9844024阅读:来源:国知局
[0105]D:1FDS求解器的数据参数;
[0106]M:1FDS求解器的方法参数;
[0107]V:1FDS求解器的值参数;
[0108]G:1FDS求解器的控制流参数;
[0109]IFDSSlover〈N,D,M,V,G>:1FDS求解器类接口 ;
[0110]FlowFunct1ns〈N,D,M>:1FDS求解器类接口中的数据流功能函数;
[0111]interproceduralCFG():1FDS求解器类接口中的控制流图功能参数;
[ΟΙ12] initialSeedsO:1FDS求解器类接口中的出初始化种子功能函数;
[ΟΙ13] zeroValueO:1FDS求解器类接口中的零值表示功能函数;
[0114]NULL:空值表示符号。
[0115]以上描述仅是本发明的一个具体实例,不构成对本发明的任何限制,显然对于本领域的专业人员来说,在了解了本发明的内容和原理后,都可能在不背离本发明原理、结构的情况下,进行形式和细节上的各种修正和改变,但是这些基于本发明的思想修正和改变仍在本发明的权利要求保护范围之内。
【主权项】
1.一种基于控制流分析和数据流分析的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>; 3幻规定过程间分布式子集问题1?05求解器的类接口1?0551(^虹〈10,1,¥,6>中包含有如下四个功能函数:数据流函数F I ο w F u n c t i ο n s〈 N,D,M >,控制流图函数interproceduralCFG(),初始化种子函数initialSeeds(),零值表不函数zeroValue(); (4)在数据流函数FlowFunct1ns〈N,D,M>中设置数据流分析规则: 4a)规定控制流图上节点的类型包括:普通节点,调用节点及返回节点; 4b)根据节点的类型规定节点之间边的类型: 若当前节点为普通节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为普通边; 若当前节点为调用节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为调用边; 若当前节点为返回节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为返回边; 若当前节点为调用节点,且当前节点的下一个节点为返回节点,则规定这两个节点之间边的类型为调用返回边; 4c)根据边的类型确定边上数据流分析的不同操作规程: 对于普通边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前普通节点的下一个普通节点; 对于调用边的操作是:先执行对应的控制流图边上的程序,再以变量名称替换和数据等量赋值的方式,将当前节点的数据传递给当前调用节点的下一个普通节点; 对于返回边的操作是:先执行对应的控制流图边上的程序,再以变量名称替回和数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前返回节点的下一个普通节占.V , 对于调用返回边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给返回节点。 (5)运行过程间分布式子集问题IFDS求解器接口类IFDSSloveKN,D,M,V,G>,在控制流图的基础上进行数据流分析: 5a)将控制流图传递给过程间分布式子集问题IFDS求解器接口类IFDSSloVer〈N,D,M,V,G>中的控制流图参数G,再通过控制流图参数G将控制流图填充到控制流图函数interproceduralCFG()中; 5b)初始化种子函数initialSeedsO,即以控制流图的第一个节点为起始节点,生成初始化种子,从初始化种子节点开始按照控制流图的执行逻辑,应用数据流分析规则,进行数据流分析; 5c)执行(4)数据流规则,根据步骤4c)数据流操作规程中的数据传递方式,确定具体的值传递操作方式: 若传递方式为数据等量赋值,则直接将该值传递给下一个节点; 若传递方式为数据空值截流,则先调用零值表示函数zeroValueO将空值转化为空值符号NULL,再将该空值符号NULL传递给下一个节点; 5d)判断当前节点传递给下一个节点是否成功: 若当前节点的下一个节点正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点成功,跳转到步骤5e); 若当前节点的下一个节点不能正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点失败,退出数据流分析; 5e)判断当前节点的下一个节点是否为最后一个节点: 若当前节点的下一个节点不是最后一个节点,则从当前节点的下一个节点开始,返回5c); 若果当前节点的下一个节点是最后一个节点,则数据流分析完成,输出最终结果。2.根据权利要求1在数据流函数F1wFunct1ns〈N, D,M>中设置数据流分析规则,其特征在于,步骤4c)中的数据等量赋值,按如下操作进行: 假设赋值的变量为X,被赋值的变量为y ; 第I步,操作系统在内存中为变量X分配一块内存空间,在这块内存空间中存储着变量X的实际值; 第2步,将变量X赋值给变量y,操作系统在内存中不给变量y分配空间,直接将变量y指向变量X的内存空间; 第3步,变量X和变量y指向同一块内存空间,改变变量X的实际值,使变量y的实际值随着变量X的实际值的改变而改变,即变量X对变量y的数据等量赋值。3.根据权利要求1在数据流函数F1wFunct1ns〈N, D,M>中设置数据流分析规则,其特征在于,步骤4c)中的数据空值截流,按如下操作进行: 假设赋值的变量为X,被赋值的变量为y ; 第一步,操作系统在内存中为变量X分配一块内存空间,在这块内存空间中存储着变量X的实际值; 第二步,将变量X赋值给变量y,操作系统在内存中不给变量y分配空间,直接将变量y指向变量X的内存空间; 第三步,将变量X的内存空间收回,变量X将不具有内存空间,即X为空值; 第四步,变量X和变量y指向同一块内存空间,变量X为空值,变量y也为空值,即变量X对变量y的数据空值截流。4.根据权利要求1所述的基于控制流分析和数据流分析的Java程序静态分析方法,其特征在于,步骤5a)中通过控制流图参数G将控制流图填充到控制流图函数interproceduralCFG()中,是先根据程序的执行逻辑,将控制流图节点中包含的数据以集合的形式传递给控制流图参数G;再调用控制流图函数i n t e rpr ο c e dura ICFG O中的构造函数接收控制流图参数G,并对控制流图参数G进行拆分和自填充。
【专利摘要】本发明公开了一种基于控制流分析和数据流分析的Java程序静态分析方法,主要解决现有静态分析方法分析准确率低的问题。其实现步骤是:1.将Java源程序转化为Jimple语言的中间表示形式;2.将Java程序静态分析问题抽象为过程间分布式子集问题IFDS;3.定义过程间分布式子集问题IFDS求解器的接口类;4.通过求解器类接口中的数据流功能函数FlowFunctions&lt;N,D,M&gt;,设置数据流分析规则;5.运行过程间分布式子集问题IFDS,在控制流图的基础上进行数据流分析,得出分析结果。本发明提高了静态分析的完整性和准确性,分析效率高,扩展性强,可用对较大系统规模的程序分析。
【IPC分类】G06F11/36
【公开号】CN105608003
【申请号】CN201510953537
【发明人】王旭, 杨超, 孙聪, 马建峰, 纪倩, 张邦元, 金方圆, 张鹏
【申请人】西安电子科技大学
【公开日】2016年5月25日
【申请日】2015年12月17日
当前第3页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1