/** * 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 + ")"; } /**
@Override public String toString() { return "Fragment(" + id + ") in file: " + layoutFile + " clazz: " + (fragmentClazz == null? "null" : fragmentClazz.getName().toString()); } }
@Override public Reader getSource(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); } ModuleEntry e = sourceMap.get(klass.getName()); return e == null ? null : new InputStreamReader(e.getInputStream()); }
@Override public String getSourceFileName(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); } ModuleEntry e = sourceMap.get(klass.getName()); return e == null ? null : e.getName(); }
@Override public Reader getSource(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); } ModuleEntry e = sourceMap.get(klass.getName()); return e == null ? null : new InputStreamReader(e.getInputStream()); }
@Override public String getSourceFileName(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); } ModuleEntry e = sourceMap.get(klass.getName()); return e == null ? null : e.getName(); }
@Override public String toString() { String methodName = klass.getName().toString(); return "Func(" + methodName.substring(methodName.lastIndexOf('/')+1) + ')'; }
@Override public String toString() { String methodName = klass.getName().toString(); return "Func(" + methodName.substring(methodName.lastIndexOf('/')+1) + ')'; }
public boolean isMemberOf(Atom klass) { return method.getDeclaringClass().getName().toString().startsWith(klass.toString()); //IClassHierarchy cha = getClassHierarchy(); //final TypeReference type = TypeReference.find(ClassLoaderReference.Primordial, klass.toString()); //if (type == null) { // throw new IllegalArgumentException("Unable to look up " + klass.toString()); //} //return cha.isSubclassOf(method.getDeclaringClass(), cha.lookupClass(type)); } /**
private boolean isExcluded(IClass cls) { if (this.analysisScope.getExclusions() != null && this.analysisScope.getExclusions().contains(cls.getName().toString())) { // XXX FUUUUU logger.info("Hit exclusions with {}", cls); return true; } else { return false; } }
@Deprecated public static boolean isApplicationClass(IClass clazz) { // we need the additional check as framework classes from the support package are loaded via the Application classloader return clazz.getClassHierarchy().getScope().isApplicationLoader(clazz.getClassLoader()) && !clazz.getName().toString().startsWith("Landroid"); // strip android.v4 / android.v7 support packages as they are considered part of the framework // TODO necessary? support packages are loaded via Primordial! }
private boolean isExcluded(IClass cls) { if (this.analysisScope.getExclusions() != null && this.analysisScope.getExclusions().contains(cls.getName().toString())) { // XXX FUUUUU logger.info("Hit exclusions with {}", cls); return true; } else { return false; } }
@Override public boolean understands(CGNode node) { return node.getMethod().getDeclaringClass().getName().equals(APPLY_TYPE_NAME); }
private boolean isExcluded(IClass cls) { if (this.analysisScope.getExclusions() != null && this.analysisScope.getExclusions().contains(cls.getName().toString())) { // XXX FUUUUU logger.info("Hit exclusions with {}", cls); return true; } else { return false; } }
private static boolean isAPIComponent(final IClass cls) { ClassLoaderReference clr = cls.getClassLoader().getReference(); if (! (clr.equals(ClassLoaderReference.Primordial) || clr.equals(ClassLoaderReference.Extension))) { if (cls.getName().toString().startsWith("Landroid/")) { return true; } return false; } else { return true; } }
private static boolean isAPIComponent(final IClass cls) { ClassLoaderReference clr = cls.getClassLoader().getReference(); if (! (clr.equals(ClassLoaderReference.Primordial) || clr.equals(ClassLoaderReference.Extension))) { if (cls.getName().toString().startsWith("Landroid/")) { return true; } return false; } else { return true; } }
public static LambdaSummaryClass findOrCreate(CGNode caller, SSAInvokeDynamicInstruction inst) { if (! summaries.containsKey(inst.getBootstrap())) { String bootstrapCls = caller.getMethod().getDeclaringClass().getName().toString().replace("/", "$").substring(1); int bootstrapIndex = inst.getBootstrap().getIndexInClassFile(); TypeReference ref = TypeReference.findOrCreate(ClassLoaderReference.Primordial, "Lwala/lambda" + '$' + bootstrapCls + '$' + bootstrapIndex); LambdaSummaryClass cls = new LambdaSummaryClass(ref, caller.getClassHierarchy(), inst); caller.getClassHierarchy().addClass(cls); summaries.put(inst.getBootstrap(), cls); } return summaries.get(inst.getBootstrap()); }
public static LambdaSummaryClass findOrCreate(CGNode caller, SSAInvokeDynamicInstruction inst) { if (! summaries.containsKey(inst.getBootstrap())) { String bootstrapCls = caller.getMethod().getDeclaringClass().getName().toString().replace("/", "$").substring(1); int bootstrapIndex = inst.getBootstrap().getIndexInClassFile(); TypeReference ref = TypeReference.findOrCreate(ClassLoaderReference.Primordial, "Lwala/lambda" + '$' + bootstrapCls + '$' + bootstrapIndex); LambdaSummaryClass cls = new LambdaSummaryClass(ref, caller.getClassHierarchy(), inst); caller.getClassHierarchy().addClass(cls); summaries.put(inst.getBootstrap(), cls); } return summaries.get(inst.getBootstrap()); }
@Test public void testIntra() { for (CGNode node : cg) { IntraproceduralExceptionAnalysis analysis = new IntraproceduralExceptionAnalysis(node, filter.getFilter(node), cha, pointerAnalysis); if (node.getMethod().getDeclaringClass().getName().getClassName().toString().equals("TestPruning")) { checkThrownExceptions(node, analysis); checkCaughtExceptions(node, analysis); } } }