From 8ae33d882b10d2a87aeba89897448ad1d715ddde Mon Sep 17 00:00:00 2001 From: t-hatano Date: Tue, 23 Feb 2016 20:55:48 +0900 Subject: [PATCH] Modified performance code. --- .../Java60RegressionExclusions.txt | 2 + JavaAnalysisToolsDemo/doc/memo.txt | 8 ---- JavaAnalysisToolsDemo/setup.sh | 3 ++ .../src/demo/soba/ClassHierarchyPerformance.java | 7 +--- .../soba/ControlAndDataDependencePerformance.java | 42 ++++++++++++++++++++ .../src/demo/soba/DumpAnalysisClass.java | 17 ++++++++ .../src/demo/soot/ClassHierarchyPerformance.java | 45 +++++---------------- .../soot/ControlAndDataDependencePerformance.java | 46 ++++++++++++++++++++++ .../src/demo/wala/ClassHierarchyPerformance.java | 20 ++++------ .../wala/ControlAndDataDependencePerformance.java | 29 ++++++++------ 10 files changed, 145 insertions(+), 74 deletions(-) delete mode 100644 JavaAnalysisToolsDemo/doc/memo.txt create mode 100644 JavaAnalysisToolsDemo/setup.sh create mode 100644 JavaAnalysisToolsDemo/src/demo/soba/ControlAndDataDependencePerformance.java create mode 100644 JavaAnalysisToolsDemo/src/demo/soba/DumpAnalysisClass.java create mode 100644 JavaAnalysisToolsDemo/src/demo/soot/ControlAndDataDependencePerformance.java diff --git a/JavaAnalysisToolsDemo/Java60RegressionExclusions.txt b/JavaAnalysisToolsDemo/Java60RegressionExclusions.txt index 0a868f5..1276e08 100644 --- a/JavaAnalysisToolsDemo/Java60RegressionExclusions.txt +++ b/JavaAnalysisToolsDemo/Java60RegressionExclusions.txt @@ -16,3 +16,5 @@ com\/apple\/.* jdk\/.* org\/omg\/.* org\/w3c\/.* +java\/text\/.* +java\/util\/.* diff --git a/JavaAnalysisToolsDemo/doc/memo.txt b/JavaAnalysisToolsDemo/doc/memo.txt deleted file mode 100644 index 40b8327..0000000 --- a/JavaAnalysisToolsDemo/doc/memo.txt +++ /dev/null @@ -1,8 +0,0 @@ -Soot: -https://github.com/Sable/soot - -WALA: -https://github.com/wala/WALA - -SOBA: -http://scm.osdn.jp/gitroot/soba/soba-core.git \ No newline at end of file diff --git a/JavaAnalysisToolsDemo/setup.sh b/JavaAnalysisToolsDemo/setup.sh new file mode 100644 index 0000000..504efa6 --- /dev/null +++ b/JavaAnalysisToolsDemo/setup.sh @@ -0,0 +1,3 @@ +git clone http://scm.osdn.jp/gitroot/soba/soba-core.git +git clone https://github.com/Sable/soot.git +git clone https://github.com/wala/WALA.git \ No newline at end of file diff --git a/JavaAnalysisToolsDemo/src/demo/soba/ClassHierarchyPerformance.java b/JavaAnalysisToolsDemo/src/demo/soba/ClassHierarchyPerformance.java index a0ef0ed..a9139ae 100644 --- a/JavaAnalysisToolsDemo/src/demo/soba/ClassHierarchyPerformance.java +++ b/JavaAnalysisToolsDemo/src/demo/soba/ClassHierarchyPerformance.java @@ -11,13 +11,10 @@ import soba.util.files.ClasspathUtil; public class ClassHierarchyPerformance { public static void main(String[] args) { - args = new String[]{"bin/demo/testdata"}; - long start = System.currentTimeMillis(); JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args)); ClassHierarchy ch = program.getClassHierarchy(); - for (ClassInfo c: program.getClasses()) { for (MethodInfo m: c.getMethods()) { for (CallSite cs: m.getCallSites()) { @@ -35,8 +32,8 @@ public class ClassHierarchyPerformance { long end = System.currentTimeMillis(); - System.out.println((end - start) + " [ms]"); - System.out.println(MemoryInfo.getMemoryInfo()); + System.err.println((end - start) + " [ms]"); + System.err.println(MemoryInfo.getMemoryInfo()); } } diff --git a/JavaAnalysisToolsDemo/src/demo/soba/ControlAndDataDependencePerformance.java b/JavaAnalysisToolsDemo/src/demo/soba/ControlAndDataDependencePerformance.java new file mode 100644 index 0000000..0f76a8a --- /dev/null +++ b/JavaAnalysisToolsDemo/src/demo/soba/ControlAndDataDependencePerformance.java @@ -0,0 +1,42 @@ +package demo.soba; + +import soba.core.ClassInfo; +import soba.core.JavaProgram; +import soba.core.MethodInfo; +import soba.core.method.DataDependence; +import soba.core.method.DataFlowEdge; +import soba.util.IntPairProc; +import soba.util.files.ClasspathUtil; +import soba.util.graph.DirectedGraph; +import demo.util.MemoryInfo; + +public class ControlAndDataDependencePerformance { + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + + JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args)); + for (ClassInfo c: program.getClasses()) { + for (MethodInfo m: c.getMethods()) { + DataDependence dd = m.getDataDependence(); + for (DataFlowEdge e: dd.getEdges()) { +// System.out.println(e.getSourceInstruction() + " -> " + e.getDestinationInstruction()); + } + DirectedGraph cd = m.getControlDependence(); + cd.forEachEdge(new IntPairProc() { + @Override + public boolean execute(int elem1, int elem2) { +// System.out.println(elem1 + " -> " + elem2); + return true; + } + }); + } + } + + long end = System.currentTimeMillis(); + + System.err.println((end - start) + " [ms]"); + System.err.println(MemoryInfo.getMemoryInfo()); + } + +} diff --git a/JavaAnalysisToolsDemo/src/demo/soba/DumpAnalysisClass.java b/JavaAnalysisToolsDemo/src/demo/soba/DumpAnalysisClass.java new file mode 100644 index 0000000..f4103e9 --- /dev/null +++ b/JavaAnalysisToolsDemo/src/demo/soba/DumpAnalysisClass.java @@ -0,0 +1,17 @@ +package demo.soba; + +import soba.core.ClassInfo; +import soba.core.JavaProgram; +import soba.util.files.ClasspathUtil; + +public class DumpAnalysisClass { + + public static void main(String[] args) { + JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args)); + program.getClasses().stream() + .map(ClassInfo::getClassName) + .map(className -> className.replaceAll("/", ".")) + .forEach(System.out::println); + } + +} diff --git a/JavaAnalysisToolsDemo/src/demo/soot/ClassHierarchyPerformance.java b/JavaAnalysisToolsDemo/src/demo/soot/ClassHierarchyPerformance.java index 75ed2e8..dfd02c8 100644 --- a/JavaAnalysisToolsDemo/src/demo/soot/ClassHierarchyPerformance.java +++ b/JavaAnalysisToolsDemo/src/demo/soot/ClassHierarchyPerformance.java @@ -1,46 +1,21 @@ package demo.soot; -import java.io.File; -import java.util.Arrays; import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.function.Consumer; import soot.MethodOrMethodContext; import soot.PackManager; import soot.Scene; import soot.SceneTransformer; +import soot.SootMethod; import soot.Transform; import soot.jimple.toolkits.callgraph.CallGraph; import soot.jimple.toolkits.callgraph.Edge; -import demo.util.DemoUtil; import demo.util.MemoryInfo; public class ClassHierarchyPerformance { public static void main(String[] args) { -// List argsList = new ArrayList(Arrays.asList(args)); - List argsList = Arrays.asList(new String[]{ - "-cp", - "bin" + File.pathSeparator + - "bin/testers" + File.pathSeparator + - DemoUtil.RT_PATH + File.pathSeparator + - DemoUtil.JCE_PATH, - "-whole-program", - "-main-class", - "testers.CallGraphs",//main-class -// "-app", -// "testers.CallGraphs", - "-p", - "cg.cha", - "apponly:true,verbose:true", - "testers.CallGraphs",//argument classes - "testers.A" // - }); - - long start = System.currentTimeMillis(); - PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTrans", new SceneTransformer() { @Override protected void internalTransform(String phaseName, Map options) { @@ -49,20 +24,20 @@ public class ClassHierarchyPerformance { MethodOrMethodContext caller = callers.next(); for (Iterator edges = cg.edgesOutOf(caller); edges.hasNext();) { Edge edge = edges.next(); -// System.out.println(edge.getSrc().method().toString() + " -> " + edge.getTgt().method().toString()); + SootMethod srcMethod = edge.getSrc().method(); + SootMethod tgtMethod = edge.getTgt().method(); +// System.out.println(srcMethod.toString() + " -> " + tgtMethod.toString()); } - } - - long end = System.currentTimeMillis(); - - System.out.println((end - start) + " [ms]"); - System.out.println(MemoryInfo.getMemoryInfo()); + } } })); - args = argsList.toArray(new String[0]); - + long start = System.currentTimeMillis(); soot.Main.main(args); + long end = System.currentTimeMillis(); + + System.err.println((end - start) + " [ms]"); + System.err.println(MemoryInfo.getMemoryInfo()); } } diff --git a/JavaAnalysisToolsDemo/src/demo/soot/ControlAndDataDependencePerformance.java b/JavaAnalysisToolsDemo/src/demo/soot/ControlAndDataDependencePerformance.java new file mode 100644 index 0000000..40a6699 --- /dev/null +++ b/JavaAnalysisToolsDemo/src/demo/soot/ControlAndDataDependencePerformance.java @@ -0,0 +1,46 @@ +package demo.soot; + +import java.util.Map; + +import soot.Body; +import soot.BodyTransformer; +import soot.PackManager; +import soot.PhaseOptions; +import soot.Transform; +import soot.toolkits.graph.ExceptionalUnitGraph; +import soot.toolkits.graph.UnitGraph; +import soot.toolkits.graph.pdg.HashMutablePDG; +import soot.toolkits.graph.pdg.PDGNode; +import soot.toolkits.graph.pdg.ProgramDependenceGraph; +import demo.util.MemoryInfo; + +public class ControlAndDataDependencePerformance { + + public static void main(String[] args) { + PackManager.v().getPack("jap").add(new Transform("jap.myTransform", new BodyTransformer() { + @Override + protected void internalTransform(Body body, String phase, Map options) { + try { + UnitGraph graph = new ExceptionalUnitGraph(body); + ProgramDependenceGraph pdg = new HashMutablePDG(graph); + for (PDGNode node1: pdg.getNodes()) { + for (PDGNode node2: pdg.getDependents(node1)) { +// System.out.println(node1.toShortString() + " -> " + node2.toShortString()); + } + } + } catch (RuntimeException e) { + System.err.println(body.getMethod()); + } + } + })); + PhaseOptions.v().setPhaseOption("jap.npc", "on"); + + long start = System.currentTimeMillis(); + soot.Main.main(args); + long end = System.currentTimeMillis(); + + System.err.println((end - start) + " [ms]"); + System.err.println(MemoryInfo.getMemoryInfo()); + } + +} diff --git a/JavaAnalysisToolsDemo/src/demo/wala/ClassHierarchyPerformance.java b/JavaAnalysisToolsDemo/src/demo/wala/ClassHierarchyPerformance.java index 357bae7..1e4cbc4 100644 --- a/JavaAnalysisToolsDemo/src/demo/wala/ClassHierarchyPerformance.java +++ b/JavaAnalysisToolsDemo/src/demo/wala/ClassHierarchyPerformance.java @@ -2,12 +2,10 @@ package demo.wala; import java.util.Iterator; -import com.ibm.wala.ipa.callgraph.AnalysisCache; -import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.AnalysisScope; import com.ibm.wala.ipa.callgraph.CGNode; -import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.Entrypoint; +import com.ibm.wala.ipa.callgraph.cha.CHACallGraph; import com.ibm.wala.ipa.callgraph.impl.Util; import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.util.config.AnalysisScopeReader; @@ -22,15 +20,11 @@ public class ClassHierarchyPerformance { try { long start = System.currentTimeMillis(); - String appJar = "bin/demo/testdata"; - AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS)); - + AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(args[0], (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS)); ClassHierarchy cha = ClassHierarchy.make(scope); - - Iterable entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha); - AnalysisOptions options = new AnalysisOptions(scope, entrypoints); - com.ibm.wala.ipa.callgraph.CallGraphBuilder builder = Util.makeZeroCFABuilder(options, new AnalysisCache(), cha, scope); - CallGraph cg = builder.makeCallGraph(options, null); + Iterable entrypoints = Util.makeMainEntrypoints(scope, cha); + CHACallGraph cg = new CHACallGraph(cha); + cg.init(entrypoints); for (int i = 0; i < cg.getMaxNumber(); i++) { CGNode caller = cg.getNode(i); @@ -42,8 +36,8 @@ public class ClassHierarchyPerformance { long end = System.currentTimeMillis(); - System.out.println((end - start) + " [ms]"); - System.out.println(MemoryInfo.getMemoryInfo()); + System.err.println((end - start) + " [ms]"); + System.err.println(MemoryInfo.getMemoryInfo()); } catch (Exception e) { e.printStackTrace(); } diff --git a/JavaAnalysisToolsDemo/src/demo/wala/ControlAndDataDependencePerformance.java b/JavaAnalysisToolsDemo/src/demo/wala/ControlAndDataDependencePerformance.java index 435a972..1cbe9d1 100644 --- a/JavaAnalysisToolsDemo/src/demo/wala/ControlAndDataDependencePerformance.java +++ b/JavaAnalysisToolsDemo/src/demo/wala/ControlAndDataDependencePerformance.java @@ -18,31 +18,30 @@ import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.modref.ModRef; import com.ibm.wala.ipa.slicer.HeapExclusions; import com.ibm.wala.ipa.slicer.PDG; -import com.ibm.wala.ipa.slicer.Statement; import com.ibm.wala.ipa.slicer.Slicer.ControlDependenceOptions; import com.ibm.wala.ipa.slicer.Slicer.DataDependenceOptions; +import com.ibm.wala.ipa.slicer.Statement; import com.ibm.wala.util.config.AnalysisScopeReader; import com.ibm.wala.util.intset.OrdinalSet; import com.ibm.wala.util.io.FileProvider; import demo.util.DemoUtil; +import demo.util.MemoryInfo; public class ControlAndDataDependencePerformance { public static void main(String[] args) { try { - String appJar = "bin/demo/testdata"; - AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS)); - - ClassHierarchy cha = ClassHierarchy.make(scope); + long start = System.currentTimeMillis(); + AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(args[0], (new FileProvider()).getFile(DemoUtil.REGRESSION_EXCLUSIONS)); + ClassHierarchy cha = ClassHierarchy.make(scope); Iterable entrypoints = Util.makeMainEntrypoints(scope, cha); + AnalysisCache cache = new AnalysisCache(); AnalysisOptions options = new AnalysisOptions(scope, entrypoints); - - // build the call graph - CallGraphBuilder cgb = Util.makeZeroCFABuilder(options, new AnalysisCache(),cha, scope, null, null); - CallGraph cg = cgb.makeCallGraph(options, null); - PointerAnalysis pa = cgb.getPointerAnalysis(); + CallGraphBuilder builder = Util.makeZeroCFABuilder(options, cache, cha, scope); + CallGraph cg = builder.makeCallGraph(options, null); + PointerAnalysis pa = null; for (int i = 0; i < cg.getMaxNumber(); i++) { CGNode node = cg.getNode(i); @@ -53,15 +52,19 @@ public class ControlAndDataDependencePerformance { Map> mod = null; Map> ref = null; PDG pdg = new PDG(node, pa, mod, ref, dOptions, cOptions, exclusions, cg, modRef); - - for (Iterator itr = pdg.iterator(); itr.hasNext();) { - Statement s1 = itr.next(); + for (Iterator statements = pdg.iterator(); statements.hasNext();) { + Statement s1 = statements.next(); for (Iterator succs = pdg.getSuccNodes(s1); succs.hasNext();) { Statement s2 = succs.next(); // System.out.println(s1.toString() + " -> " + s2.toString()); } } } + + long end = System.currentTimeMillis(); + + System.err.println((end - start) + " [ms]"); + System.err.println(MemoryInfo.getMemoryInfo()); } catch (Exception e) { e.printStackTrace(); } -- 2.11.0