1 19 20 package soot.jimple.spark.builder; 21 import soot.jimple.spark.*; 22 import soot.jimple.spark.pag.*; 23 import soot.jimple.*; 24 import soot.*; 25 import soot.util.*; 26 import soot.toolkits.scalar.Pair; 27 import soot.jimple.spark.internal.*; 28 import soot.jimple.toolkits.callgraph.Edge; 29 import java.util.*; 30 31 34 public class GlobalNodeFactory { 35 public GlobalNodeFactory( PAG pag ) { 36 this.pag = pag; 37 } 38 39 final public Node caseDefaultClassLoader() { 40 AllocNode a = pag.makeAllocNode( 41 PointsToAnalysis.DEFAULT_CLASS_LOADER, 42 AnySubType.v( RefType.v( "java.lang.ClassLoader" ) ), null ); 43 VarNode v = pag.makeGlobalVarNode( 44 PointsToAnalysis.DEFAULT_CLASS_LOADER_LOCAL, 45 RefType.v( "java.lang.ClassLoader" ) ); 46 pag.addEdge( a, v ); 47 return v; 48 } 49 final public Node caseMainClassNameString() { 50 AllocNode a = pag.makeAllocNode( 51 PointsToAnalysis.MAIN_CLASS_NAME_STRING, 52 RefType.v( "java.lang.String" ), null ); 53 VarNode v = pag.makeGlobalVarNode( 54 PointsToAnalysis.MAIN_CLASS_NAME_STRING_LOCAL, 55 RefType.v( "java.lang.String" ) ); 56 pag.addEdge( a, v ); 57 return v; 58 } 59 final public Node caseMainThreadGroup() { 60 AllocNode threadGroupNode = pag.makeAllocNode( 61 PointsToAnalysis.MAIN_THREAD_GROUP_NODE, 62 RefType.v("java.lang.ThreadGroup"), null ); 63 VarNode threadGroupNodeLocal = pag.makeGlobalVarNode( 64 PointsToAnalysis.MAIN_THREAD_GROUP_NODE_LOCAL, 65 RefType.v("java.lang.ThreadGroup") ); 66 pag.addEdge( threadGroupNode, threadGroupNodeLocal ); 67 return threadGroupNodeLocal; 68 } 69 final public Node caseMainThread() { 70 AllocNode threadNode = pag.makeAllocNode( 71 PointsToAnalysis.MAIN_THREAD_NODE, 72 RefType.v("java.lang.Thread"), null ); 73 VarNode threadNodeLocal = pag.makeGlobalVarNode( 74 PointsToAnalysis.MAIN_THREAD_NODE_LOCAL, 75 RefType.v("java.lang.Thread") ); 76 pag.addEdge( threadNode, threadNodeLocal ); 77 return threadNodeLocal; 78 } 79 final public Node caseArgv() { 80 AllocNode argv = pag.makeAllocNode( 81 PointsToAnalysis.STRING_ARRAY_NODE, 82 ArrayType.v(RefType.v( "java.lang.String" ), 1), null ); 83 VarNode sanl = pag.makeGlobalVarNode( 84 PointsToAnalysis.STRING_ARRAY_NODE_LOCAL, 85 ArrayType.v(RefType.v( "java.lang.String" ), 1) ); 86 AllocNode stringNode = pag.makeAllocNode( 87 PointsToAnalysis.STRING_NODE, 88 RefType.v( "java.lang.String" ), null ); 89 VarNode stringNodeLocal = pag.makeGlobalVarNode( 90 PointsToAnalysis.STRING_NODE_LOCAL, 91 RefType.v( "java.lang.String" ) ); 92 pag.addEdge( argv, sanl ); 93 pag.addEdge( stringNode, stringNodeLocal ); 94 pag.addEdge( stringNodeLocal, 95 pag.makeFieldRefNode( sanl, ArrayElement.v() ) ); 96 return sanl; 97 } 98 99 final public Node caseNewInstance( VarNode cls ) { 100 if( cls instanceof ContextVarNode ) cls = pag.findLocalVarNode( cls.getVariable() ); 101 AllocNode site = pag.makeAllocNode( cls, AnySubType.v( RefType.v( "java.lang.Object" ) ), null ); 102 VarNode local = pag.makeGlobalVarNode( site, RefType.v( "java.lang.Object" ) ); 103 pag.addEdge( site, local ); 104 return local; 105 } 106 107 public Node caseThrow() { 108 VarNode ret = pag.makeGlobalVarNode( PointsToAnalysis.EXCEPTION_NODE, 109 RefType.v("java.lang.Throwable") ); 110 ret.setInterProcTarget(); 111 ret.setInterProcSource(); 112 return ret; 113 } 114 115 116 117 protected PAG pag; 118 } 119 120 | Popular Tags |