/** * Checks if all parameters and return value of a method have primitive types. * * @param mtd Method. * @return boolean True if all parameters and return value are of primitive type, otherwise false. */ private static boolean isAllPrimitiveTypes(IMethod mtd) { if (!mtd.getReturnType().isPrimitiveType()) return false; for (int i = (mtd.isStatic() ? 0 : 1); i < mtd.getNumberOfParameters(); i++) { if (!mtd.getParameterType(i).isPrimitiveType()) return false; } return true; }
/** * Get astubx style method signature. {FullyQualifiedEnclosingType}: {UnqualifiedMethodReturnType} * {methodName} ([{UnqualifiedArgumentType}*]) * * @param mtd Method reference. * @return String Method signature. */ // TODO: handle generics and inner classes private static String getSignature(IMethod mtd) { String classType = mtd.getDeclaringClass().getName().toString().replaceAll("/", "\\.").substring(1); classType = classType.replaceAll("\\$", "\\."); // handle inner class String returnType = mtd.isInit() ? null : getSimpleTypeName(mtd.getReturnType()); String strArgTypes = ""; int argi = mtd.isStatic() ? 0 : 1; // Skip 'this' parameter for (; argi < mtd.getNumberOfParameters(); argi++) { strArgTypes += getSimpleTypeName(mtd.getParameterType(argi)); if (argi < mtd.getNumberOfParameters() - 1) strArgTypes += ", "; } return classType + ":" + (returnType == null ? "void " : returnType + " ") + mtd.getName().toString() + "(" + strArgTypes + ")"; } /**
if (!mtd.getReturnType().isPrimitiveType()) { if (analysisDriver == null) { analysisDriver = getAnalysisDriver(mtd, options, cache, cha);
if (method.getReturnType().isPrimitiveType()) { LOG(DEBUG, "DEBUG", "Skipping method with primitive return type: " + method.getSignature()); return NullnessHint.UNKNOWN;
/** * Handed through to the IMethod / MethodReference */ public TypeReference getReturnType() { switch (this.base) { case IMETHOD: return this.method.getReturnType(); case METHOD_REFERENCE: return this.mRef.getReturnType(); default: throw new UnsupportedOperationException("No implementation of getReturnType() for base " + this.base); } }
/** * Handed through to the IMethod / MethodReference */ public TypeReference getReturnType() { switch (this.base) { case IMETHOD: return this.method.getReturnType(); case METHOD_REFERENCE: return this.mRef.getReturnType(); default: throw new UnsupportedOperationException("No implementation of getReturnType() for base " + this.base); } }
/** * Return a List of all Types returned by functions between start (inclusive) and end (exclusive). * * @return That list * @throws IllegalArgumentException if an EntryPoint was not an AndroidEntryPoint */ protected List<TypeReference> returnTypesBetween(IExecutionOrder start, IExecutionOrder end) { assert (start != null) : "The argument start was null"; assert (end != null) : "The argument end was null"; List<TypeReference> returnTypes = new ArrayList<>(); for (Entrypoint ep : this.entryPoints) { if (ep instanceof AndroidEntryPoint) { AndroidEntryPoint aep = (AndroidEntryPoint)ep; if ((aep.compareTo(start) >= 0) && (aep.compareTo(end) <= 0)) { if (! (aep.getMethod().getReturnType().equals(TypeReference.Void) || aep.getMethod().getReturnType().isPrimitiveType ())) { if (! returnTypes.contains(aep.getMethod().getReturnType())) { // TODO: Use a set? returnTypes.add(aep.getMethod().getReturnType()); } } } } else { throw new IllegalArgumentException("Entrypoint (given to Constructor) is not an AndroidEntryPoint!"); } } return returnTypes; } //
/** * Return a List of all Types returned by functions between start (inclusive) and end (exclusive). * * @return That list * @throws IllegalArgumentException if an EntryPoint was not an AndroidEntryPoint */ protected List<TypeReference> returnTypesBetween(IExecutionOrder start, IExecutionOrder end) { assert (start != null) : "The argument start was null"; assert (end != null) : "The argument end was null"; List<TypeReference> returnTypes = new ArrayList<>(); for (Entrypoint ep : this.entryPoints) { if (ep instanceof AndroidEntryPoint) { AndroidEntryPoint aep = (AndroidEntryPoint)ep; if ((aep.compareTo(start) >= 0) && (aep.compareTo(end) <= 0)) { if (! (aep.getMethod().getReturnType().equals(TypeReference.Void) || aep.getMethod().getReturnType().isPrimitiveType ())) { if (! returnTypes.contains(aep.getMethod().getReturnType())) { // TODO: Use a set? returnTypes.add(aep.getMethod().getReturnType()); } } } } else { throw new IllegalArgumentException("Entrypoint (given to Constructor) is not an AndroidEntryPoint!"); } } return returnTypes; } //
/** * create nodes representing defs of the return values */ private void createReturnStatements() { ArrayList<Statement> list = new ArrayList<>(); if (!node.getMethod().getReturnType().equals(TypeReference.Void)) { NormalReturnCallee n = new NormalReturnCallee(node); delegate.addNode(n); list.add(n); } if (!dOptions.isIgnoreExceptions()) { ExceptionalReturnCallee e = new ExceptionalReturnCallee(node); delegate.addNode(e); list.add(e); } if (!dOptions.isIgnoreHeap()) { for (PointerKey p : mod.get(node)) { Statement h = new HeapStatement.HeapReturnCallee(node, p); delegate.addNode(h); list.add(h); } } returnStatements = new Statement[list.size()]; list.toArray(returnStatements); }
/** * create nodes representing defs of the return values */ private void createReturnStatements() { ArrayList<Statement> list = new ArrayList<>(); if (!node.getMethod().getReturnType().equals(TypeReference.Void)) { NormalReturnCallee n = new NormalReturnCallee(node); delegate.addNode(n); list.add(n); } if (!dOptions.isIgnoreExceptions()) { ExceptionalReturnCallee e = new ExceptionalReturnCallee(node); delegate.addNode(e); list.add(e); } if (!dOptions.isIgnoreHeap()) { for (PointerKey p : mod.get(node)) { Statement h = new HeapStatement.HeapReturnCallee(node, p); delegate.addNode(h); list.add(h); } } returnStatements = new Statement[list.size()]; list.toArray(returnStatements); }
if (m.getReturnType().getClassLoader().equals(ClassLoaderReference.Application)) { IClass ct = m.getClassHierarchy().lookupClass(m.getReturnType()); sb.append(ct == null || WalaUtils.isAppClass(ct)? customTypeReplacement : m.getReturnType().getName().toString()); } else sb.append(m.getReturnType().getName().toString());
if (m.getReturnType().getClassLoader().equals(ClassLoaderReference.Application)) { IClass ct = m.getClassHierarchy().lookupClass(m.getReturnType()); sb.append(ct == null || WalaUtils.isAppClass(ct)? customTypeReplacement : m.getReturnType().getName().toString()); } else sb.append(m.getReturnType().getName().toString());
if (! target.getReturnType().toString().equals(test.getReturnType().toString())) return false;
(target.getReturnType().toString().equals(test.getReturnType().toString())) && // same return type (target.getNumberOfParameters() == test.getNumberOfParameters()-1)) { // one more arg (!target.getReturnType().toString().equals(test.getReturnType().toString())) && // different return type
} else { Dispatch d = target.isStatic() ? Dispatch.STATIC : Dispatch.VIRTUAL; if (target.getReturnType().equals(TypeReference.Void)) { m.addInstruction(null, insts.InvokeInstruction(m.allInstructions.size(), args, exceptions, CallSiteReference.make(pc++, target.getReference(), d), null), false);
} else { Dispatch d = target.isStatic() ? Dispatch.STATIC : Dispatch.VIRTUAL; if (target.getReturnType().equals(TypeReference.Void)) { m.addInstruction(null, insts.InvokeInstruction(m.allInstructions.size(), args, exceptions, CallSiteReference.make(pc++, target.getReference(), d), null), false);
final List<SSAValue> params = pAcc.connectThrough(externalAcc, null, null, this.cha, instantiator, false, null, null); final SSAValue excpetion = pm.getException(); extRet = pm.getUnmanaged(external.getReturnType() , "extRet"); final int pc = this.body.getNextProgramCounter(); final CallSiteReference site = CallSiteReference.make(pc, external.getReference(), IInvokeInstruction.Dispatch.STATIC);
final List<SSAValue> params = pAcc.connectThrough(externalAcc, null, null, this.cha, instantiator, false, null, null); final SSAValue excpetion = pm.getException(); extRet = pm.getUnmanaged(external.getReturnType() , "extRet"); final int pc = this.body.getNextProgramCounter(); final CallSiteReference site = CallSiteReference.make(pc, external.getReference(), IInvokeInstruction.Dispatch.STATIC);
private IClass inferType(PointerKey key) { if (key instanceof LocalPointerKeyWithFilter) { LocalPointerKeyWithFilter lpk = (LocalPointerKeyWithFilter) key; FilteredPointerKey.TypeFilter filter = lpk.getTypeFilter(); assert filter instanceof FilteredPointerKey.SingleClassFilter; return ((FilteredPointerKey.SingleClassFilter) filter).getConcreteType(); } else if (key instanceof StaticFieldKey) { StaticFieldKey s = (StaticFieldKey) key; return getCallGraph().getClassHierarchy().lookupClass(s.getField().getFieldTypeReference()); } else if (key instanceof InstanceFieldKey) { InstanceFieldKey i = (InstanceFieldKey) key; return getCallGraph().getClassHierarchy().lookupClass(i.getField().getFieldTypeReference()); } else if (key instanceof ArrayContentsKey) { ArrayContentsKey i = (ArrayContentsKey) key; FilteredPointerKey.TypeFilter filter = i.getTypeFilter(); assert filter instanceof FilteredPointerKey.SingleClassFilter; return ((FilteredPointerKey.SingleClassFilter) filter).getConcreteType(); } else if (key instanceof ExceptionReturnValueKey) { return getCallGraph().getClassHierarchy().lookupClass(TypeReference.JavaLangException); } else if (key instanceof ReturnValueKey) { ReturnValueKey r = (ReturnValueKey) key; return getCallGraph().getClassHierarchy().lookupClass(r.getNode().getMethod().getReturnType()); } else { Assertions.UNREACHABLE("inferType " + key.getClass()); return null; } }
private IClass inferType(PointerKey key) { if (key instanceof LocalPointerKeyWithFilter) { LocalPointerKeyWithFilter lpk = (LocalPointerKeyWithFilter) key; FilteredPointerKey.TypeFilter filter = lpk.getTypeFilter(); assert filter instanceof FilteredPointerKey.SingleClassFilter; return ((FilteredPointerKey.SingleClassFilter) filter).getConcreteType(); } else if (key instanceof StaticFieldKey) { StaticFieldKey s = (StaticFieldKey) key; return getCallGraph().getClassHierarchy().lookupClass(s.getField().getFieldTypeReference()); } else if (key instanceof InstanceFieldKey) { InstanceFieldKey i = (InstanceFieldKey) key; return getCallGraph().getClassHierarchy().lookupClass(i.getField().getFieldTypeReference()); } else if (key instanceof ArrayContentsKey) { ArrayContentsKey i = (ArrayContentsKey) key; FilteredPointerKey.TypeFilter filter = i.getTypeFilter(); assert filter instanceof FilteredPointerKey.SingleClassFilter; return ((FilteredPointerKey.SingleClassFilter) filter).getConcreteType(); } else if (key instanceof ExceptionReturnValueKey) { return getCallGraph().getClassHierarchy().lookupClass(TypeReference.JavaLangException); } else if (key instanceof ReturnValueKey) { ReturnValueKey r = (ReturnValueKey) key; return getCallGraph().getClassHierarchy().lookupClass(r.getNode().getMethod().getReturnType()); } else { Assertions.UNREACHABLE("inferType " + key.getClass()); return null; } }