package soot;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import soot.Body;
import soot.BodyTransformer;
import soot.G;
import soot.PackManager;
import soot.PhaseOptions;
import soot.SootMethod;
import soot.Transform;
import soot.Unit;
import soot.jimple.JimpleBody;
import soot.options.Options;
import soot.toolkits.graph.DirectedGraph;
import soot.toolkits.graph.UnitGraph;
import soot.util.cfgcmd.AltClassLoader;
import soot.util.cfgcmd.CFGGraphType;
import soot.util.cfgcmd.CFGIntermediateRep;
import soot.util.cfgcmd.CFGToDotGraph;
import soot.util.dot.DotGraph;
public class Generate extends BodyTransformer {
private static final String altClassPathOptionName = "alt-class-path";
private static final String graphTypeOptionName = "graph-type";
private static final String defaultGraph = "BriefUnitGraph";
private static final String irOptionName = "ir";
private static final String defaultIR = "jimple";
private static final String multipageOptionName = "multipages";
private static final String briefLabelOptionName = "brief";
private CFGGraphType graphtype;
private CFGIntermediateRep ir;
private CFGToDotGraph drawer;
protected void internalTransform(Body b, String phaseName, Map<String, String> options) {
initialize(options);
System.out.println(options);
System.out.println(b);
Body body = ir.getBody((JimpleBody) b);
//System.out.println(body);
print_cfg(body);
}
public static void main(String[] args) {
Generate viewer = new Generate();
Transform printTransform = new Transform("jtp.printcfg", viewer);
printTransform.setDeclaredOptions("enabled " + altClassPathOptionName + ' ' + graphTypeOptionName + ' '
+ irOptionName + ' ' + multipageOptionName + ' ' + briefLabelOptionName + ' ');
printTransform.setDefaultOptions("enabled " + altClassPathOptionName + ": " + graphTypeOptionName + ':'
+ defaultGraph + ' ' + irOptionName + ':' + defaultIR + ' ' + multipageOptionName + ":false " + ' '
+ briefLabelOptionName + ":false ");
PackManager.v().getPack("jtp").add(printTransform);
//args = viewer.parse_options(args);
String[] soot_args = new String[3];
//soot_args[0] = "-cp";
soot_args[0] = "--soot-classpath";
soot_args[1] = "bin/;C:/Program Files/Java/jre1.8.0_121/lib/rt.jar";
soot_args[2] ="TriangleClass.Triangle";
soot.Main.main(soot_args);
}
private void initialize(Map<String, String> options) {
if (drawer == null) {
drawer = new CFGToDotGraph();
drawer.setBriefLabels(PhaseOptions.getBoolean(options, briefLabelOptionName));
drawer.setOnePage(!PhaseOptions.getBoolean(options, multipageOptionName));
drawer.setUnexceptionalControlFlowAttr("color", "black");
drawer.setExceptionalControlFlowAttr("color", "red");
drawer.setExceptionEdgeAttr("color", "lightgray");
drawer.setShowExceptions(Options.v().show_exception_dests());
ir = CFGIntermediateRep.getIR(PhaseOptions.getString(options, irOptionName));
graphtype = CFGGraphType.getGraphType(PhaseOptions.getString(options, graphTypeOptionName));
AltClassLoader.v().setAltClassPath(PhaseOptions.getString(options, altClassPathOptionName));
AltClassLoader.v().setAltClasses(
new String[] { "soot.toolkits.graph.ArrayRefBlockGraph", "soot.toolkits.graph.Block",
"soot.toolkits.graph.Block$AllMapTo", "soot.toolkits.graph.BlockGraph",
"soot.toolkits.graph.BriefBlockGraph", "soot.toolkits.graph.BriefUnitGraph",
"soot.toolkits.graph.CompleteBlockGraph", "soot.toolkits.graph.CompleteUnitGraph",
"soot.toolkits.graph.TrapUnitGraph", "soot.toolkits.graph.UnitGraph",
"soot.toolkits.graph.ZonedBlockGraph", });
}
}
protected void print_cfg(Body body) {
DirectedGraph<Unit> graph = graphtype.buildGraph(body);
//System.out.println(graph);
DotGraph canvas = graphtype.drawGraph(drawer, graph, body);
//GenerateFlow gen = new GenerateFlow((UnitGraph) graph);
String methodname = body.getMethod().getSubSignature();
String classname = body.getMethod().getDeclaringClass().getName().replaceAll("\\$", "\\.");
String filename = soot.SourceLocator.v().getOutputDir();
if (filename.length() > 0) {
filename = filename + java.io.File.separator;
}
filename = filename + classname + " " + methodname.replace(java.io.File.separatorChar, '.') + DotGraph.DOT_EXTENSION;
G.v().out.println("Generate dot file in " + filename);
canvas.plot(filename);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
soot生成java程序的控制流图例子
共10个文件
class:3个
java:2个
project:1个
4星 · 超过85%的资源 需积分: 35 139 下载量 28 浏览量
2017-03-23
20:42:36
上传
评论 3
收藏 11.98MB ZIP 举报
温馨提示
在java工程中利用soot-jar包,生成java程序的dot文件,再利用graphviz画出java程序的控制流图。
资源推荐
资源详情
资源评论
收起资源包目录
CfgDemo.zip (10个子文件)
CfgDemo
.project 383B
src
soot
Generate.java 4KB
TriangleClass
Triangle.java 816B
lib
soot-trunk.jar 13.25MB
sootOutput
TriangleClass.Triangle java.lang.String triangle(int,int,int).dot 1KB
TriangleClass
Triangle.class 399B
.settings
org.eclipse.jdt.core.prefs 598B
.classpath 358B
bin
soot
Generate.class 6KB
TriangleClass
Triangle.class 623B
共 10 条
- 1
资源评论
- yi_882017-07-10在吗?看到希望解答一下,你这个Demo具体是怎么运行的,就是操作的过程。刚刚学习,希望可以解答,谢谢
- 刀光剑影闯荡江湖2017-12-26还没有使用呢,使用后再评论~
- 衣带渐宽人憔悴2021-03-28java1.7、1.8运行均出错啊Ubuntu
- baidu_210102012017-12-06资源还可以
灰黑飞
- 粉丝: 51
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功