soot生成java程序的控制流图
在java工程中利用soot-jar包,生成java程序的dot文件,再利用graphviz画出java程序的控制流图。
代码片段和文件信息
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-03-23 20:36 CfgDemo
文件 358 2017-03-23 20:36 CfgDemo.classpath
文件 383 2017-03-23 14:58 CfgDemo.project
目录 0 2017-03-23 14:58 CfgDemo.settings
文件 598 2017-03-23 14:58 CfgDemo.settingsorg.eclipse.jdt.core.prefs
目录 0 2017-03-23 20:36 CfgDemoin
目录 0 2017-03-23 20:36 CfgDemoinTriangleClass
文件 623 2017-03-23 20:36 CfgDemoinTriangleClassTriangle.class
目录 0 2017-03-23 20:36 CfgDemoinsoot
文件 6185 2017-03-23 20:36 CfgDemoinsootGenerate.class
目录 0 2017-03-23 20:35 CfgDemolib
文件 13892031 2017-03-23 20:35 CfgDemolibsoot-trunk.jar
目录 0 2017-03-23 20:37 CfgDemosootOutput
目录 0 2017-03-23 20:36 CfgDemosootOutputTriangleClass
文件 399 2017-03-23 20:36 CfgDemosootOutputTriangleClassTriangle.class
文件 1498 2017-03-23 20:36 CfgDemosootOutputTriangleClass.Triangle java.lang.String triangle(intintint).dot
目录 0 2017-03-23 20:36 CfgDemosrc
目录 0 2017-03-23 14:59 CfgDemosrcTriangleClass
文件 816 2017-03-23 15:00 CfgDemosrcTriangleClassTriangle.java
目录 0 2017-03-23 20:35 CfgDemosrcsoot
文件 4585 2017-03-23 19:40 CfgDemosrcsootGenerate.java
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 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 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(
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-03-23 20:36 CfgDemo
文件 358 2017-03-23 20:36 CfgDemo.classpath
文件 383 2017-03-23 14:58 CfgDemo.project
目录 0 2017-03-23 14:58 CfgDemo.settings
文件 598 2017-03-23 14:58 CfgDemo.settingsorg.eclipse.jdt.core.prefs
目录 0 2017-03-23 20:36 CfgDemoin
目录 0 2017-03-23 20:36 CfgDemoinTriangleClass
文件 623 2017-03-23 20:36 CfgDemoinTriangleClassTriangle.class
目录 0 2017-03-23 20:36 CfgDemoinsoot
文件 6185 2017-03-23 20:36 CfgDemoinsootGenerate.class
目录 0 2017-03-23 20:35 CfgDemolib
文件 13892031 2017-03-23 20:35 CfgDemolibsoot-trunk.jar
目录 0 2017-03-23 20:37 CfgDemosootOutput
目录 0 2017-03-23 20:36 CfgDemosootOutputTriangleClass
文件 399 2017-03-23 20:36 CfgDemosootOutputTriangleClassTriangle.class
文件 1498 2017-03-23 20:36 CfgDemosootOutputTriangleClass.Triangle java.lang.String triangle(intintint).dot
目录 0 2017-03-23 20:36 CfgDemosrc
目录 0 2017-03-23 14:59 CfgDemosrcTriangleClass
文件 816 2017-03-23 15:00 CfgDemosrcTriangleClassTriangle.java
目录 0 2017-03-23 20:35 CfgDemosrcsoot
文件 4585 2017-03-23 19:40 CfgDemosrcsootGenerate.java
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。
评论列表(条)