soot生成java程序的控制流图


在java工程中利用soot-jar包,生成java程序的dot文件,再利用graphviz画出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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)