/** * What method is the declared callee? */ public MethodReference getDeclaredTarget() { return site.getDeclaredTarget(); }
@Override public String toString() { StringBuilder str = new StringBuilder("["); for (int i = 0; i < sites.length; i++) { str.append(' ').append(methods[i].getSignature()).append('@').append(sites[i].getProgramCounter()); } str.append(" ]"); return str.toString(); }
@Override public int hashCode() { return (site.hashCode() * 7529) + (exception * 9823); }
@Override public String toString() { return "invoke" + getInvocationString(getInvocationCode()) + ' ' + declaredTarget + '@' + getProgramCounter(); }
/** * @see com.ibm.wala.ssa.SSAInstruction#getNumberOfUses() */ @Override public int getNumberOfUses() { if (params == null) { assert site.getInvocationCode() == IInvokeInstruction.Dispatch.STATIC || site.getInvocationCode() == IInvokeInstruction.Dispatch.SPECIAL; assert site.getDeclaredTarget().getNumberOfParameters() == 0; return 0; } else { return params.length; } }
/** * @return the invoke instructions added by this operation * @throws IllegalArgumentException if site is null */ public SSAAbstractInvokeInstruction addInvocation(int[] params, CallSiteReference site) { if (site == null) { throw new IllegalArgumentException("site is null"); } CallSiteReference newSite = CallSiteReference.make(statements.size(), site.getDeclaredTarget(), site.getInvocationCode()); SSAAbstractInvokeInstruction s = null; if (newSite.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) { s = insts.InvokeInstruction(statements.size(), params, nextLocal++, newSite, null); } else { s = insts.InvokeInstruction(statements.size(), nextLocal++, params, nextLocal++, newSite, null); } statements.add(s); cache.invalidate(this, Everywhere.EVERYWHERE); return s; }
/** * Add an instruction to invoke the default constructor on the object of value number alloc of type t. */ protected void addCtorInvokeInstruction(final TypeReference t, int alloc) { MethodReference init = MethodReference.findOrCreate(t, MethodReference.initAtom, MethodReference.defaultInitDesc); CallSiteReference site = CallSiteReference.make(getCallSiteForType(t), init, IInvokeInstruction.Dispatch.SPECIAL); int[] params = new int[1]; params[0] = alloc; int exc = getExceptionsForType(t); SSAInvokeInstruction s = insts.InvokeInstruction(allInstructions.size(), params, exc, site, null); calls.add(s); allInstructions.add(s); } }
private static boolean dispatchIndex(CallSiteReference ref, int i) { if (ref.isStatic()) { return ! ref.getDeclaredTarget().getParameterType(i).isPrimitiveType(); } else { return i==0 || ! ref.getDeclaredTarget().getParameterType(i-1).isPrimitiveType(); } }
final MethodReference target = site.getDeclaredTarget(); if (intentStarters.isStarter(target)) { final StartInfo info = intentStarters.getInfo(target); } else if (site.isSpecial() && target.getDeclaringClass().getName().equals( AndroidTypes.IntentName)) { final MethodReference mRef = site.getDeclaredTarget(); final int numArgs = mRef.getNumberOfParameters(); return IntSetUtil.make(new int[] { 0, 1 }); case 2: logger.debug("Got Intent Constructor of: {}", site.getDeclaredTarget().getSelector()); return IntSetUtil.make(new int[] { 0, 1, 2 }); case 3: logger.debug("Got Intent Constructor of: {}", site.getDeclaredTarget().getSelector()); return IntSetUtil.make(new int[] { 0, 1, 2, 3 }); case 4: logger.debug("Got Intent Constructor of: {}", site.getDeclaredTarget().getSelector()); return IntSetUtil.make(new int[] { 0, 1, 2, 3, 4 }); default: logger.debug("Got Intent Constructor of: {}", site.getDeclaredTarget().getSelector()); return IntSetUtil.make(new int[] { 0, 1, 2, 3, 4, 5 }); } else if (site.isSpecial() && target.getDeclaringClass().getName().equals( AndroidTypes.IntentSenderName)) {
@Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; } else { return EmptyIntSet.instance; } }
/** * Is this an invokespecial call site? */ public final boolean isSpecial() { return (getInvocationCode() == IInvokeInstruction.Dispatch.SPECIAL); }
@Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isStatic()) { return EmptyIntSet.instance; } else { return receiver; } }
/** * Is this a 'special' call? (invokespecial in Java) */ public boolean isSpecial() { return getCallSite().isSpecial(); }
/** * @return the invoke instructions added by this operation * @throws IllegalArgumentException if site is null */ public SSAAbstractInvokeInstruction addInvocation(int[] params, CallSiteReference site) { if (site == null) { throw new IllegalArgumentException("site is null"); } CallSiteReference newSite = CallSiteReference.make(statements.size(), site.getDeclaredTarget(), site.getInvocationCode()); SSAAbstractInvokeInstruction s = null; if (newSite.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) { s = insts.InvokeInstruction(statements.size(), params, nextLocal++, newSite, null); } else { s = insts.InvokeInstruction(statements.size(), nextLocal++, params, nextLocal++, newSite, null); } statements.add(s); cache.invalidate(this, Everywhere.EVERYWHERE); return s; }
/** * Add an instruction to invoke the default constructor on the object of value number alloc of type t. */ protected void addCtorInvokeInstruction(final TypeReference t, int alloc) { MethodReference init = MethodReference.findOrCreate(t, MethodReference.initAtom, MethodReference.defaultInitDesc); CallSiteReference site = CallSiteReference.make(getCallSiteForType(t), init, IInvokeInstruction.Dispatch.SPECIAL); int[] params = new int[1]; params[0] = alloc; int exc = getExceptionsForType(t); SSAInvokeInstruction s = insts.InvokeInstruction(allInstructions.size(), params, exc, site, null); calls.add(s); allInstructions.add(s); } }
private static boolean dispatchIndex(CallSiteReference ref, int i) { if (ref.isStatic()) { return ! ref.getDeclaredTarget().getParameterType(i).isPrimitiveType(); } else { return i==0 || ! ref.getDeclaredTarget().getParameterType(i-1).isPrimitiveType(); } }
final MethodReference target = site.getDeclaredTarget(); if (intentStarters.isStarter(target)) { final StartInfo info = intentStarters.getInfo(target); } else if (site.isSpecial() && target.getDeclaringClass().getName().equals( AndroidTypes.IntentName)) { final MethodReference mRef = site.getDeclaredTarget(); final int numArgs = mRef.getNumberOfParameters(); return IntSetUtil.make(new int[] { 0, 1 }); case 2: logger.debug("Got Intent Constructor of: {}", site.getDeclaredTarget().getSelector()); return IntSetUtil.make(new int[] { 0, 1, 2 }); case 3: logger.debug("Got Intent Constructor of: {}", site.getDeclaredTarget().getSelector()); return IntSetUtil.make(new int[] { 0, 1, 2, 3 }); case 4: logger.debug("Got Intent Constructor of: {}", site.getDeclaredTarget().getSelector()); return IntSetUtil.make(new int[] { 0, 1, 2, 3, 4 }); default: logger.debug("Got Intent Constructor of: {}", site.getDeclaredTarget().getSelector()); return IntSetUtil.make(new int[] { 0, 1, 2, 3, 4, 5 }); } else if (site.isSpecial() && target.getDeclaringClass().getName().equals( AndroidTypes.IntentSenderName)) {
/** * @see com.ibm.wala.ssa.SSAInstruction#getNumberOfUses() */ @Override public int getNumberOfUses() { if (params == null) { assert site.getInvocationCode() == IInvokeInstruction.Dispatch.STATIC || site.getInvocationCode() == IInvokeInstruction.Dispatch.SPECIAL; assert site.getDeclaredTarget().getNumberOfParameters() == 0; return 0; } else { return params.length; } }
@Override public String toString() { return "invoke" + getInvocationString(getInvocationCode()) + ' ' + declaredTarget + '@' + getProgramCounter(); }