/** * This constructor builds the incomplete hack call graph for the Dava ThrowFinder. It uses all application class methods * as entry points, and it ignores any calls by non-application class methods. Don't use this constructor if you need a * real call graph. */ public CallGraphBuilder() { logger.warn("using incomplete callgraph containing " + "only application classes."); pa = soot.jimple.toolkits.pointer.DumbPointerAnalysis.v(); cg = Scene.v().internalMakeCallGraph(); Scene.v().setCallGraph(cg); List<MethodOrMethodContext> entryPoints = new ArrayList<MethodOrMethodContext>(); entryPoints.addAll(EntryPoints.v().methodsOfApplicationClasses()); entryPoints.addAll(EntryPoints.v().implicit()); reachables = new ReachableMethods(cg, entryPoints); ContextManager cm = new ContextInsensitiveContextManager(cg); ofcgb = new OnFlyCallGraphBuilder(cm, reachables, true); }
private void constantForName(String cls, SootMethod src, Stmt srcUnit) { if (cls.length() > 0 && cls.charAt(0) == '[') { if (cls.length() > 1 && cls.charAt(1) == 'L' && cls.charAt(cls.length() - 1) == ';') { cls = cls.substring(2, cls.length() - 1); constantForName(cls, src, srcUnit); } } else { if (!Scene.v().containsClass(cls)) { if (options.verbose()) { logger.warn("Class " + cls + " is" + " a dynamic class, and you did not specify" + " it as such; graph will be incomplete!"); } } else { SootClass sootcls = Scene.v().getSootClass(cls); if (!sootcls.isPhantomClass()) { if (!sootcls.isApplicationClass()) { sootcls.setLibraryClass(); } for (SootMethod clinit : EntryPoints.v().clinitsOf(sootcls)) { addEdge(src, srcUnit, clinit, Kind.CLINIT); } } } } }
public void build() { QueueReader<MethodOrMethodContext> worklist = reachables.listener(); while (true) { ofcgb.processReachables(); reachables.update(); if (!worklist.hasNext()) { List<Local> receivers = ofcgb.methodToReceivers().get(momc.method()); if (receivers != null) { for (Iterator<Local> receiverIt = receivers.iterator(); receiverIt.hasNext();) { for (Iterator<Type> typeIt = p2set.possibleTypes().iterator(); typeIt.hasNext();) { final Type type = typeIt.next(); ofcgb.addType(receiver, momc.context(), type, null); List<Local> bases = ofcgb.methodToInvokeArgs().get(momc.method()); if (bases != null) { for (Local base : bases) { PointsToSet pts = pa.reachingObjects(base); for (Type ty : pts.possibleTypes()) { ofcgb.addBaseType(base, momc.context(), ty); List<Local> argArrays = ofcgb.methodToInvokeBases().get(momc.method()); if (argArrays != null) { for (final Local argArray : argArrays) { ofcgb.addInvokeArgType(argArray, momc.context(), t); List<Local> stringConstants = ofcgb.methodToStringConstants().get(momc.method()); if (stringConstants != null) {
private void processNewMethod(SootMethod m) { if (!m.isConcrete()) { return; } Body b = m.retrieveActiveBody(); getImplicitTargets(m); findReceivers(m, b); }
Local receiver = (Local) iie.getBase(); NumberedString subSig = iie.getMethodRef().getSubSignature(); addVirtualCallSite(s, m, receiver, iie, subSig, Edge.ieToKind(iie)); if (subSig == sigStart) { addVirtualCallSite(s, m, receiver, iie, sigRun, Kind.THREAD); } else if (subSig == sigExecutorExecute || subSig == sigHandlerPost || subSig == sigHandlerPostAtFrontOfQueue || subSig == sigHandlerPostAtTime || subSig == sigHandlerPostAtTimeWithToken Value runnable = iie.getArg(0); if (runnable instanceof Local) { addVirtualCallSite(s, m, (Local) runnable, iie, sigRun, Kind.EXECUTOR); || subSig == sigHandlerSendMessageAtFrontOfQueue || subSig == sigHandlerSendMessageAtTime || subSig == sigHandlerSendMessageDelayed) { addVirtualCallSite(s, m, receiver, iie, sigHandlerHandleMessage, Kind.HANDLER); } else if (subSig == sigExecute) { addVirtualCallSite(s, m, receiver, iie, sigDoInBackground, Kind.ASYNCTASK); SootMethod tgt = ie.getMethod(); if (tgt != null) { addEdge(m, s, tgt); String signature = tgt.getSignature(); if (signature addVirtualCallSite(s, m, receiver, null, sigObjRun, Kind.PRIVILEGED);
public void build() { QueueReader worklist = reachables.listener(); while(true) { ofcgb.processReachables(); reachables.update(); if( !worklist.hasNext() ) break; MethodOrMethodContext momc = (MethodOrMethodContext) worklist.next(); List receivers = (List) ofcgb.methodToReceivers().get(momc.method()); if( receivers != null) for( Iterator receiverIt = receivers.iterator(); receiverIt.hasNext(); ) { final Local receiver = (Local) receiverIt.next(); for( Iterator typeIt = p2set.possibleTypes().iterator(); typeIt.hasNext(); ) { final Type type = (Type) typeIt.next(); ofcgb.addType( receiver, momc.context(), type, null ); List stringConstants = (List) ofcgb.methodToStringConstants().get(momc.method()); if( stringConstants != null ) for( Iterator stringConstantIt = stringConstants.iterator(); stringConstantIt.hasNext(); ) { final Local stringConstant = (Local) stringConstantIt.next(); Collection possibleStringConstants = p2set.possibleStringConstants(); if( possibleStringConstants == null ) { ofcgb.addStringConstant( stringConstant, momc.context(), null ); } else { for( Iterator constantIt = possibleStringConstants.iterator(); constantIt.hasNext(); ) { final String constant = (String) constantIt.next(); ofcgb.addStringConstant( stringConstant, momc.context(), constant );
handleInit(source, scl); SootClass cl = ie.getMethodRef().declaringClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge(source, s, clinit, Kind.CLINIT); SootClass cl = fr.getFieldRef().declaringClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge(source, s, clinit, Kind.CLINIT); SootClass cl = r.getBaseType().getSootClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge(source, s, clinit, Kind.CLINIT); SootClass cl = ((RefType) t).getSootClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge(source, s, clinit, Kind.CLINIT);
private void handleInit(SootMethod source, final SootClass scl) { addEdge(source, null, scl, sigFinalize, Kind.FINALIZE); }
public final void visit(Node n) { if (n instanceof StringConstantNode) { String constant = ((StringConstantNode) n).getString(); ofcgb.addStringConstant(receiver, context, constant); } else { ofcgb.addStringConstant(receiver, context, null); } } });
public final void visit(Node n) { if (n instanceof AllocNode) { ofcgb.addType(receiver, context, n.getType(), (AllocNode) n); } } });
public void build() { QueueReader worklist = reachables.listener(); while(true) { ofcgb.processReachables(); reachables.update(); if( !worklist.hasNext() ) break; MethodOrMethodContext momc = (MethodOrMethodContext) worklist.next(); List receivers = (List) ofcgb.methodToReceivers().get(momc.method()); if( receivers != null) for( Iterator receiverIt = receivers.iterator(); receiverIt.hasNext(); ) { final Local receiver = (Local) receiverIt.next(); for( Iterator typeIt = p2set.possibleTypes().iterator(); typeIt.hasNext(); ) { final Type type = (Type) typeIt.next(); ofcgb.addType( receiver, momc.context(), type, null ); List stringConstants = (List) ofcgb.methodToStringConstants().get(momc.method()); if( stringConstants != null ) for( Iterator stringConstantIt = stringConstants.iterator(); stringConstantIt.hasNext(); ) { final Local stringConstant = (Local) stringConstantIt.next(); Collection possibleStringConstants = p2set.possibleStringConstants(); if( possibleStringConstants == null ) { ofcgb.addStringConstant( stringConstant, momc.context(), null ); } else { for( Iterator constantIt = possibleStringConstants.iterator(); constantIt.hasNext(); ) { final String constant = (String) constantIt.next(); ofcgb.addStringConstant( stringConstant, momc.context(), constant );
private void processNewMethod( SootMethod m ) { if( m.isNative() || m.isPhantom() ) { return; } Body b = m.retrieveActiveBody(); getImplicitTargets( m ); findReceivers(m, b); } private void findReceivers(SootMethod m, Body b) {
NumberedString subSig = iie.getMethodRef().getSubSignature(); addVirtualCallSite( s, m, receiver, iie, subSig, Edge.ieToKind(iie) ); if( subSig == sigStart ) { addVirtualCallSite( s, m, receiver, iie, sigRun, Kind.THREAD ); addEdge(m, s, tgt); if( tgt.getSignature().equals( "<java.security.AccessController: java.lang.Object doPrivileged(java.security.PrivilegedAction)>" ) || tgt.getSignature().equals( "<java.security.AccessController: java.lang.Object doPrivileged(java.security.PrivilegedExceptionAction)>" ) addVirtualCallSite( s, m, receiver, null, sigObjRun, Kind.PRIVILEGED );
if( source.isNative() || source.isPhantom() ) return; if( source.getSubSignature().indexOf( "<init>" ) >= 0 ) { handleInit(source, scl); SootClass cl = ie.getMethodRef().declaringClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge( source, s, clinit, Kind.CLINIT ); SootClass cl = fr.getFieldRef().declaringClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge( source, s, clinit, Kind.CLINIT ); SootClass cl = r.getBaseType().getSootClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge( source, s, clinit, Kind.CLINIT ); SootClass cl = ((RefType) t).getSootClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge( source, s, clinit, Kind.CLINIT );
private void addEdge(SootMethod src, Stmt stmt, SootClass cls, NumberedString methodSubSig, Kind kind) { SootMethod sm = cls.getMethodUnsafe(methodSubSig); if (sm != null) { addEdge(src, stmt, sm, kind); } }
private void processNewMethod( SootMethod m ) { if( m.isNative() || m.isPhantom() ) { return; } Body b = m.retrieveActiveBody(); getImplicitTargets( m ); findReceivers(m, b); } private void findReceivers(SootMethod m, Body b) {
private void constantForName( String cls, SootMethod src, Stmt srcUnit ) { if( cls.length() > 0 && cls.charAt(0) == '[' ) { if( cls.length() > 1 && cls.charAt(1) == 'L' && cls.charAt(cls.length()-1) == ';' ) { cls = cls.substring(2,cls.length()-1); constantForName( cls, src, srcUnit ); } } else { if( !Scene.v().containsClass( cls ) ) { if( options.verbose() ) { G.v().out.println( "Warning: Class "+cls+" is"+ " a dynamic class, and you did not specify"+ " it as such; graph will be incomplete!" ); } } else { SootClass sootcls = Scene.v().getSootClass( cls ); if( !sootcls.isApplicationClass() ) { sootcls.setLibraryClass(); } for (SootMethod clinit : EntryPoints.v().clinitsOf(sootcls)) { addEdge( src, srcUnit, clinit, Kind.CLINIT ); } } } }
NumberedString subSig = iie.getMethodRef().getSubSignature(); addVirtualCallSite( s, m, receiver, iie, subSig, Edge.ieToKind(iie) ); if( subSig == sigStart ) { addVirtualCallSite( s, m, receiver, iie, sigRun, Kind.THREAD ); addEdge(m, s, tgt); if( tgt.getSignature().equals( "<java.security.AccessController: java.lang.Object doPrivileged(java.security.PrivilegedAction)>" ) || tgt.getSignature().equals( "<java.security.AccessController: java.lang.Object doPrivileged(java.security.PrivilegedExceptionAction)>" ) addVirtualCallSite( s, m, receiver, null, sigObjRun, Kind.PRIVILEGED );
if( source.isNative() || source.isPhantom() ) return; if( source.getSubSignature().indexOf( "<init>" ) >= 0 ) { handleInit(source, scl); SootClass cl = ie.getMethodRef().declaringClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge( source, s, clinit, Kind.CLINIT ); SootClass cl = fr.getFieldRef().declaringClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge( source, s, clinit, Kind.CLINIT ); SootClass cl = r.getBaseType().getSootClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge( source, s, clinit, Kind.CLINIT ); SootClass cl = ((RefType) t).getSootClass(); for (SootMethod clinit : EntryPoints.v().clinitsOf(cl)) { addEdge( source, s, clinit, Kind.CLINIT );
private void addEdge(SootMethod src, Stmt stmt, SootMethod tgt) { InvokeExpr ie = stmt.getInvokeExpr(); addEdge(src, stmt, tgt, Edge.ieToKind(ie)); }