-
Notifications
You must be signed in to change notification settings - Fork 1
/
SootHeapClass.java
84 lines (73 loc) · 2.45 KB
/
SootHeapClass.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import java.io.File;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import soot.*;
import soot.jimple.internal.JAssignStmt;
import soot.jimple.AssignStmt;
import soot.jimple.DefinitionStmt;
import soot.jimple.FieldRef;
import soot.jimple.IdentityStmt;
import soot.jimple.InstanceFieldRef;
import soot.jimple.InstanceInvokeExpr;
import soot.jimple.IntConstant;
import soot.jimple.InvokeExpr;
import soot.jimple.InvokeStmt;
import soot.jimple.Jimple;
import soot.jimple.NullConstant;
import soot.jimple.StaticFieldRef;
import soot.jimple.Stmt;
import soot.jimple.StringConstant;
import soot.options.Options;
import soot.jimple.GotoStmt;
import soot.jimple.ArrayRef;
public class SootHeapClass extends BodyTransformer {
public static void main(String[] args) {
String javapath = System.getProperty("java.class.path");
String jredir = System.getProperty("java.home")+"/lib/rt.jar";
String path = javapath+File.pathSeparator+jredir;
Scene.v().setSootClassPath(path);
SootHeapClass analysis = new SootHeapClass();
PackManager.v().getPack("jtp").add(new Transform("jtp.SootHeapClass", analysis));
Options.v().set_app(true);
SootClass appclass = Scene.v().loadClassAndSupport("fibonacci");
Scene.v().setMainClass(appclass);
Scene.v().loadNecessaryClasses();
PackManager.v().runPacks();
PackManager.v().writeOutput();
}
@Override
protected void internalTransform(Body b, String phaseName,
Map<String, String> options) {
Iterator<Unit> it = b.getUnits().snapshotIterator();
while(it.hasNext()){
Unit u = it.next();
if(u instanceof Stmt){
Stmt gtSt = (Stmt) u;
if(gtSt instanceof AssignStmt){
AssignStmt js = (AssignStmt)gtSt;
Value lhs = js.getLeftOp();
Value rhs = js.getRightOp();
if(lhs instanceof ArrayRef){
G.v().out.println("Statement " +lhs.toString() + " = " + rhs.toString() + ",\t\t\t heap write");
}
if(rhs instanceof ArrayRef){
G.v().out.println("Statement " + lhs.toString() + " = " + rhs.toString() + ",\t\t\t heap read");
}
if(lhs instanceof InstanceFieldRef){
G.v().out.println("Statement " +lhs.toString() + " = " + rhs.toString() + ",\t\t heap write");
}
if(rhs instanceof InstanceFieldRef){
G.v().out.println("Statement " +lhs.toString() + " = " + rhs.toString() + ",\t\t heap read");
}
if(lhs instanceof StaticFieldRef){
G.v().out.println("Statement " +lhs.toString() + " = " + rhs.toString() + ",\t\t\t heap write");
}
if(rhs instanceof StaticFieldRef){
G.v().out.println("Statement " +lhs.toString() + " = " + rhs.toString() + ",\t heap read");
}
}
}
}
}
}