CN106610898B - 一种基于JPF的Java代码SSA单路径的生成方法 - Google Patents
一种基于JPF的Java代码SSA单路径的生成方法 Download PDFInfo
- Publication number
- CN106610898B CN106610898B CN201611233490.5A CN201611233490A CN106610898B CN 106610898 B CN106610898 B CN 106610898B CN 201611233490 A CN201611233490 A CN 201611233490A CN 106610898 B CN106610898 B CN 106610898B
- Authority
- CN
- China
- Prior art keywords
- jpf
- java
- code
- single path
- file
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于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目录下,作为输出。
Description
技术领域
本发明涉及一种基于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:将上述修改操作写回到源代码。
下面给出一个转换前后对比的例子:
。
以上所述,仅为本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更改或修饰为等同变化的等效例,则仍属于本发明技术方案的保护范围内。
Claims (4)
1.一种基于JPF的Java代码SSA单路径的生成方法,其特征在于,包括如下步骤:
步骤10:输入.java文件和.jpf文件,存放在src目录下;
步骤11:对.java文件进行代码插桩,以便获得path condition;
所述步骤11中,进行代码插桩过程包括:
步骤11-20:使用ASTParser获得单路径代码的AST;
步骤11-21:使用ASTVisitor遍历Java代码的AST获取所有控制转移语句IfStatement;
步骤11-22:使用ASTRewrite修改AST的树结构,在IfStatement成立的程序入口ThenStatement处插入一条空的IfStatement,控制条件与当前控制语句的控制条件相同;
步骤11-23:使用ASTRewrite修改AST的树结构,在IfStatement不成立的程序入口ElseSatement处插入一条空的IfStatement,控制条件为当前控制语句的控制条件的非;
步骤11-24:将上述修改操作写回到源代码。
步骤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.根据权利要求1所述的基于JPF的Java代码SSA单路径的生成方法,其特征在于:所述步骤10所输入的Java工程源代码和JPF配置文件具有如下的目录结构:
经过步骤16之后,最终输出相应的结果:
3.根据权利要求1所述的基于JPF的Java代码SSA单路径的生成方法,其特征在于:所述步骤14中,使用JPF的jpf-symbc对.class文件进行符号执行,获取指定方法中的可达的单路径,根据插桩信息提取出path condition的过程包括:
步骤30:将.jpf中的配置信息传给JPF启动类,其中.jpf文件的书写遵循JPF配置文件的书写规范;
步骤31:将classpath指定为步骤12得到的bin目录,将sourcepath指定为src目录,将Listener设为MyPathListener;
步骤32:MyPathListener是工具自定义的一个ListenerAdapter,它在JPF执行过程中监听每一条指令的执行,抽取出每条指令所对应的源代码行号;
步骤33:JPF会执行Java代码中的每一条路径,在执行过程中我们获得每一条路径对应的行号序列,将其对应到源代码,提取插桩信息作为path condition。
4.根据权利要求1所述的基于JPF的Java代码SSA单路径的生成方法,其特征在于:所述步骤15中,将单路径转化为SSA的形式的过程包括:
步骤40:使用ASTParser获得单路径代码的AST;
步骤41:使用ASTVisitor遍历AST,收集变量的声明、引用和赋值;
步骤42:使用ASTRewrite删掉AST所有关于变量声明的ASTNode;
步骤43:每当变量被赋值,就为该变量赋予一个新的变量名,对应AST中的SimpleName节点,使之成为一个新变量,该次赋值之后到下一次赋值之前对变量的引用均用新的变量名替换,在程序的开头添加新变量的声明;
步骤44:将上述修改操作写回到源代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611233490.5A CN106610898B (zh) | 2016-12-28 | 2016-12-28 | 一种基于JPF的Java代码SSA单路径的生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611233490.5A CN106610898B (zh) | 2016-12-28 | 2016-12-28 | 一种基于JPF的Java代码SSA单路径的生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106610898A CN106610898A (zh) | 2017-05-03 |
CN106610898B true CN106610898B (zh) | 2019-01-04 |
Family
ID=58636202
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611233490.5A Active CN106610898B (zh) | 2016-12-28 | 2016-12-28 | 一种基于JPF的Java代码SSA单路径的生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106610898B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107992324A (zh) * | 2017-12-22 | 2018-05-04 | 南京大学 | 一种基于约束求解的代码搜索方法 |
CN108304320A (zh) * | 2018-01-05 | 2018-07-20 | 西北工业大学 | 基于动态符号执行的Java程序错误检测方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102231109A (zh) * | 2011-07-15 | 2011-11-02 | 南京大学 | 无痕可管理的源代码自动插桩方法 |
CN102368226A (zh) * | 2011-10-10 | 2012-03-07 | 南京大学 | 一种基于扩展有限状态机可行路径分析的测试用例自动生成方法 |
CN103581015A (zh) * | 2013-11-07 | 2014-02-12 | 清华大学 | 一种基于as环的域间不相交多路径生成方法 |
CN104317576A (zh) * | 2014-07-04 | 2015-01-28 | 北京思特奇信息技术股份有限公司 | 一种基于eclipse的代码自动生成方法及系统 |
CN105356979A (zh) * | 2015-12-11 | 2016-02-24 | 中山大学 | 一种基于双路径并行传输的无线传感网络代码分发方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7370321B2 (en) * | 2002-11-14 | 2008-05-06 | Microsoft Corporation | Systems and methods to read, optimize, and verify byte codes for a multiplatform jit |
-
2016
- 2016-12-28 CN CN201611233490.5A patent/CN106610898B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102231109A (zh) * | 2011-07-15 | 2011-11-02 | 南京大学 | 无痕可管理的源代码自动插桩方法 |
CN102368226A (zh) * | 2011-10-10 | 2012-03-07 | 南京大学 | 一种基于扩展有限状态机可行路径分析的测试用例自动生成方法 |
CN103581015A (zh) * | 2013-11-07 | 2014-02-12 | 清华大学 | 一种基于as环的域间不相交多路径生成方法 |
CN104317576A (zh) * | 2014-07-04 | 2015-01-28 | 北京思特奇信息技术股份有限公司 | 一种基于eclipse的代码自动生成方法及系统 |
CN105356979A (zh) * | 2015-12-11 | 2016-02-24 | 中山大学 | 一种基于双路径并行传输的无线传感网络代码分发方法 |
Non-Patent Citations (5)
Title |
---|
[Java Path Finder][JPF学习笔记][6]jpf-symbc的初步使用;qysh123;《https://blog.csdn.net/qysh123/article/details/7067971》;20111213;1-2 * |
Dead code elimination technique in eclipse compiler for Java;Hiral H.Karer 等;《2015 International Conference on Control, Instrumentation, Communication and Computational Technologies (ICCICCT)》;20160523;275-278 * |
Java Pathfinder 安装编译详解;wirror800;《https://blog.csdn.net/wirror800/article/details/4154092》;20090506;1-2 * |
Java PathFinder(一) Java PathFinder基于Eclipse的安装配置及使用;qq_4451605;《https://blog.csdn.net/qq_4451605/article/details/51405405》;20160514;1-12 * |
静态单赋值理解;xiaoquan9653;<https://blog.csdn.net/xiaoquan9653/article/details/51507655>;20160526;1-3 * |
Also Published As
Publication number | Publication date |
---|---|
CN106610898A (zh) | 2017-05-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104778124B (zh) | 一种软件应用自动化测试方法 | |
Hästbacka et al. | Model-driven development of industrial process control applications | |
KR101314949B1 (ko) | 통합 환경 생성기 | |
US8091071B2 (en) | Method and system for template-based code generation | |
CN104317589B (zh) | 一种用于加载动态链接库的代码自动生成方法及装置 | |
US9405518B2 (en) | Leveraging legacy applications for use with modern applications | |
Cánovas Izquierdo et al. | Extracting models from source code in software modernization | |
US8806452B2 (en) | Transformation of computer programs and eliminating errors | |
CN110531971B (zh) | 访问代码自动生成方法、装置、计算机设备及存储介质 | |
Guana et al. | Chaintracker, a model-transformation trace analysis tool for code-generation environments | |
CN106610898B (zh) | 一种基于JPF的Java代码SSA单路径的生成方法 | |
CN103744684A (zh) | 一种异构软硬件协同开发的方法及系统 | |
CN106776231B (zh) | 基于Git的Android崩溃日志优化方法及系统 | |
CN108762749A (zh) | 基于代码分析的系统对象图自动生成方法 | |
CN102521008A (zh) | 程序编译装置和程序编译方法 | |
CN106649118B (zh) | 一种基于AST的Java代码SSA单路径的生成方法 | |
US9612829B2 (en) | System and method for pattern based services extraction | |
CN104899042A (zh) | 一种嵌入式机器视觉检测程序开发方法及系统 | |
CN110472411B (zh) | 一种内存溢出处理方法、装置、设备及可读存储介质 | |
JP5041990B2 (ja) | ソフトウェア部品抽出支援装置 | |
Lajmi et al. | DSLFORGE: Textual Modeling on the Web. | |
CN106033338A (zh) | 基于fog数据的源代码导入及解析的方法和装置 | |
CN114036055A (zh) | 一种xmind测试用例与jmeter脚本互转的系统 | |
Porubän et al. | Model-aware language specification with java | |
JP2016051367A (ja) | データ解析装置、データ解析方法、および、プログラム。 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |