一种基于JPF的Java代码SSA单路径的生成方法与流程

文档序号:11063421阅读:584来源:国知局
一种基于JPF的Java代码SSA单路径的生成方法与制造工艺

本发明涉及一种基于JPF的Java代码SSA单路径的生成方法。



背景技术:

程序静态分析(Program Static Analysis)是在不运行程序的前提下进行的代码分析工作,随着越来越多的代码被上传到开源代码库中,大多数代码不可以直接运行,我们要对这些开源代码进行分析理解,就需要借助静态分析技术。静态分析技术中经常会涉及到符号执行(Symbolic Execution),抽象语法树(Abstract Syntax Tree,AST)分析,控制流分析(Control Flow Analysis)等,借鉴这些静态分析技术的思想,我们旨在提供一种Java代码静态单赋值(Static Single Assignment,SSA)格式的单路径的生成方法支持Java代码静态分析方面的工作,研究者可以在该工具的基础上进行Java代码的分析,降低了直接从代码文本进行分析的复杂性。

JPF(Java PathFinder)是由NASA开发的针对Java程序的模型检验工具,它的核心是一个Java虚拟机,其符号执行模块jpf-symbc可以对Java代码进行符号执行,提取出程序中的每一条可达路径以及路径上的约束。

JDT(Java Development Tools)是Eclipse提供的一组用于实现Java IDE的工具,核心是AST,利用JDT提供的AST访问API,我们可以将Java代码转化成AST,遍历AST树节点,修改AST树结构并将修改写回到源代码。



技术实现要素:

针对现有技术中存在的问题,本发明目的是,提供一种Java代码SSA格式的单路径的生成方法支持Java代码静态分析方面的工作,研究者可以在该工具的基础上进行Java代码的分析,降低了直接从代码文本进行分析的复杂性。

本发明是通过以下的技术方案实现的:一种基于JPF的Java代码SSA单路径的生成方法,包括步骤:

步骤10:输入.java文件和.jpf文件,存放在src目录下;

步骤11:对.java文件进行代码插桩,以便获得path condition;

步骤12:编译得到.class文件,存放在bin目录下;

步骤13:从.jpf文件获得JPF执行的相关参数;

步骤14:使用JPF的jpf-symbc模块对.class文件进行符号执行,获取指定方法中的可达的单路径,根据插桩信息提取出path condition;

步骤15:使用JDT AST修改单路径代码的AST,将单路径转化为SSA的格式;

步骤16:将SSA格式的单路径以及path condition封装成符合Java语法规范的Java类,存放在path目录下,作为输出。

其中步骤10所输入的Java工程源代码和JPF配置文件具有如下的目录结构:

经过步骤16之后,最终输出相应的结果:

在步骤11中,进行代码插桩过程包括:

步骤20:使用ASTParser获得单路径代码的AST;

步骤21:使用ASTVisitor遍历Java代码的AST获取所有控制转移语句如IfStatement,WhileStatement,以IfStatement为例;

步骤22:使用ASTRewrite修改AST的树结构,在IfStatement成立的程序入口(ThenStatement)处插入一条空的IfStatement,控制条件与当前控制语句的控制条件相同;

步骤23:使用ASTRewrite修改AST的树结构,在IfStatement不成立的程序入口(ElseSatement)处插入一条空的IfStatement,控制条件为当前控制语句的控制条件的非;

步骤24:将上述修改操作写回到源代码。

在步骤14中,使用JPF的jpf-symbc对.class文件进行符号执行,获取指定方法中的可达的单路径,根据插桩信息提取出path condition的过程包括:

步骤30:将.jpf中的配置信息传给JPF启动类,其中.jpf文件的书写遵循JPF配置文件的书写规范

步骤31:将classpath指定为步骤12得到的bin目录,将sourcepath指定为src目录,将Listener设为MyPathListener;

步骤32:MyListener是工具自定义的一个ListenerAdapter,它在JPF执行过程中监听每一条指令的执行,抽取出每条指令所对应的源代码行号;

步骤33:JPF会执行Java代码中的每一条路径,在执行过程中我们获得每一条路径对应的行号序列,将其对应到源代码,提取插桩信息作为path condition。

处理流程如图5所示:本发明实施例的监听JPF指令执行获得单路径示意图。

在步骤15中,将单路径转化为SSA的形式的过程包括:

步骤40:使用ASTParser获得单路径代码的AST;

步骤41:使用ASTVisitor遍历AST,收集变量的声明、引用、赋值;

步骤42:使用ASTRewrite删掉AST所有关于变量声明的ASTNode;

步骤43:每当变量被赋值,就为该变量赋予一个新的变量名(对应AST中的SimpleName节点),使之成为一个新变量,该次赋值之后到下一次赋值之前对变量的引用均用新的变量名替换,在程序的开头添加新变量的声明;

步骤44:将上述修改操作写回到源代码。

本发明有益效果:这是一个源代码层面的借助于JPF提取Java代码中的单路径然后利用JDT AST将其转化为SSA格式的静态分析辅助工具,利用这种工具,Java程序被简化成了一条条SSA格式的单路径代码,从而降低了直接从源代码进行分析的复杂性。

附图说明

图1本发明实施例的Java代码转化为SSA单路径示意图。

图2本发明实施例的输入目录结构示意图。

图3本发明实施例的输出目录结构示意图。

图4本发明实施例的代码插桩获得路径条件示意图。

图5本发明实施例的监听JPF指令执行获得单路径示意图。

图6本发明实施例的单路径代码转换为SSA格式示意图。

具体实施方式

以下结合附图和具体实施例对本发明作进一步详细说明。

本发明方法工作流程如图1-图6所示。

图1所示为本方法实施的整体结构和工作原理。本方法的目的是提供一个源代码层面的借助于JPF提取Java代码中的单路径然后利用JDT AST将其转化为SSA格式的静态分析辅助工具,利用这种工具,Java程序被简化成了一条条SSA格式的单路径代码,从而降低了直接从源代码进行分析的复杂性。

本实施例的一种基于JPF的Java代码SSA单路径的生成方法,包括如下步骤:

步骤10:输入.java文件和.jpf文件,存放在src目录下;

步骤11:对.java文件进行代码插桩,以便获得path condition;

步骤12:编译得到.class文件,存放在bin目录下;

步骤13:从.jpf文件获得JPF执行的相关参数;

步骤14:使用JPF的jpf-symbc模块对.class文件进行符号执行,获取指定方法中的可达的单路径,根据插桩信息提取出path condition;

步骤15:使用JDT AST修改单路径代码的AST,将单路径转化为SSA的格式;

步骤16:将SSA格式的单路径以及path condition封装成符合Java语法规范的Java类,存放在path目录下,作为输出。

图2表示的是步骤10所输入的Java工程源代码和JPF配置文件所在src目录的目录结构示意图。其中步骤10所输入的Java工程源代码和JPF配置文件具有如下的目录结构:

图3表示的是经过步骤16之后,存放单路径代码的path目录所具有的目录结构示意图。经过步骤16之后,最终的输出结果如下:

图4表示的是在步骤11中使用JDT AST进行代码插桩的处理示意图,执行的过程包括:

步骤20:使用ASTParser获得单路径代码的AST;

步骤21:使用ASTVisitor遍历Java代码的AST获取所有控制转移语句如IfStatement,WhileStatement,下面以IfStatement为例;

步骤22:使用ASTRewrite修改AST的树结构,在IfStatement成立的程序入口(ThenStatement)处插入一条空的IfStatement,控制条件与当前控制语句的控制条件相同;

步骤23:使用ASTRewrite修改AST的树结构,在IfStatement不成立的程序入口(ElseSatement)处插入一条空的IfStatement,控制条件为当前控制语句的控制条件的非;

步骤24:将上述修改操作写回到源代码。

下面给出一个插桩前后对比的例子:

图5表示的是在步骤14中使用JPF的jpf-symbc对.class文件进行符号执行,获取指定方法中的可达的单路径,根据插桩信息提取出path condition的处理示意图,执行的过程包括:

步骤30:将.jpf中的配置信息传给JPF启动类,其中.jpf文件的书写遵循JPF配置文件的书写规范;

步骤31:将classpath指定为步骤12得到的bin目录,将sourcepath指定为src目录,将Listener设为MyPathListener;

步骤32:MyListener是工具自定义的一个ListenerAdapter,它在JPF执行过程中监听每一条指令的执行,抽取出每条指令所对应的源代码行号;

步骤33:JPF会执行Java代码中的每一条路径,在执行过程中我们获得每一条路径对应的行号序列,将其对应到源代码,提取插桩信息作为path condition。

处理流程如图5所示:本发明实施例的监听JPF指令执行获得单路径示意图。

图6表示的是在步骤15中,将单路径转化为SSA的形式的处理示意图,执行的过程包括:

步骤40:使用ASTParser获得单路径代码的AST;

步骤41:使用ASTVisitor遍历AST,收集变量的声明、引用、赋值;

步骤42:使用ASTRewrite删掉AST所有关于变量声明的ASTNode;

步骤43:每当变量被赋值,就为该变量赋予一个新的变量名(对应AST中的SimpleName节点),使之成为一个新变量,该次赋值之后到下一次赋值之前对变量的引用均用新的变量名替换,在程序的开头添加新变量的声明;

步骤44:将上述修改操作写回到源代码。

下面给出一个转换前后对比的例子:

以上所述,仅为本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更改或修饰为等同变化的等效例,则仍属于本发明技术方案的保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1