protected void print_cfg(Body body) { DirectedGraph<Unit> graph = graphtype.buildGraph(body); DotGraph canvas = graphtype.drawGraph(drawer, graph, body); String methodname = body.getMethod().getSubSignature(); String filename = soot.SourceLocator.v().getOutputDir(); if (filename.length() > 0) { filename = filename + java.io.File.separator; } filename = filename + methodname.replace(java.io.File.separatorChar, '.') + DotGraph.DOT_EXTENSION; G.v().out.println("Generate dot file in " + filename); canvas.plot(filename); }
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", }); } }
private static void usage() { G.v() .out .println( "Usage:\n" + " java soot.util.CFGViewer [soot options] [CFGViewer options] [class[:method]]...\n\n" + " CFGViewer options:\n" + " (When specifying the value for an '=' option, you only\n" + " need to type enough characters to specify the choice\n" + " unambiguously, and case is ignored.)\n" + "\n" + " --alt-classpath PATH :\n" + " specifies the classpath from which to load classes\n" + " that implement graph types whose names begin with 'Alt'.\n" + " --graph={" + CFGGraphType.help(0, 70, " ".length()) + "} :\n" + " show the specified type of graph.\n" + " Defaults to " + defaultGraph + ".\n" + " --ir={" + CFGIntermediateRep.help(0, 70, " ".length()) + "} :\n" + " create the CFG from the specified intermediate\n" + " representation. Defaults to " + defaultIR + ".\n" + " --brief :\n" + " label nodes with the unit or block index,\n" + " instead of the text of their statements.\n" + " --multipages :\n" + " produce dot file output for multiple 8.5x11\" pages.\n" + " By default, a single page is produced.\n" + " --help :\n" + " print this message.\n" + "\n" + " Particularly relevant soot options (see \"soot --help\" for details):\n" + " --soot-class-path PATH\n" + " --show-exception-dests\n" + " --throw-analysis {pedantic|unit}\n" + " --omit-excepting-unit-edges\n" + " --trim-cfgs\n"); }