@Override public @CheckForNull XMethodParameter getNonNullParameter() { return new XMethodParameter(m, param); }
public @CheckForNull NullnessAnnotation getDirectAnnotation(Object o) { Profiler profiler = Global.getAnalysisCache().getProfiler(); profiler.start(this.getClass()); try { if (DEBUG) { System.out.println("getDirectAnnotation: o=" + o + "..."); } TypeQualifierAnnotation tqa = null; if (o instanceof XMethodParameter) { XMethodParameter param = (XMethodParameter) o; tqa = TypeQualifierApplications.getDirectTypeQualifierAnnotation(param.getMethod(), param.getParameterNumber(), nonnullTypeQualifierValue); } else if (o instanceof XMethod || o instanceof XField) { tqa = TypeQualifierApplications.getEffectiveTypeQualifierAnnotation((AnnotatedObject) o, nonnullTypeQualifierValue); } NullnessAnnotation result = toNullnessAnnotation(tqa); if (DEBUG) { if (result == null) { System.out.println(" ===> not found"); } else { System.out.println(" ===> " + tqa + "/" + result.toString() ); } } return result; } finally { profiler.end(this.getClass()); } }
private AnnotationEnum lookInOverriddenMethod(final Object originalQuery, String classToLookIn, XMethod originalMethod, boolean getMinimal) { try { AnnotationEnum n; // Look in supermethod XMethod superMethod = XFactory.createXMethod(classToLookIn, originalMethod.getName(), originalMethod.getSignature(), originalMethod.isStatic()); if (!superMethod.isResolved()) { return null; } if (DEBUG) { System.out.println("Looking for overridden method " + superMethod); } Object probe; if (originalQuery instanceof XMethod) { probe = superMethod; } else if (originalQuery instanceof XMethodParameter) { probe = new XMethodParameter(superMethod, ((XMethodParameter) originalQuery).getParameterNumber()); } else { throw new IllegalStateException("impossible"); } n = getResolvedAnnotation(probe, getMinimal); return n; } catch (RuntimeException e) { AnalysisContext.logError("Exception while looking for annotation of " + originalMethod + "in " + classToLookIn, e); return null; } }
className = m.getClassName(); } else if (o instanceof XMethodParameter) { m = ((XMethodParameter) o).getMethod();
private AnnotationEnum lookInOverriddenMethod(final Object originalQuery, String classToLookIn, XMethod originalMethod, boolean getMinimal) { try { AnnotationEnum n; // Look in supermethod XMethod superMethod = XFactory.createXMethod(classToLookIn, originalMethod.getName(), originalMethod.getSignature(), originalMethod.isStatic()); if (!superMethod.isResolved()) { return null; } if (DEBUG) { System.out.println("Looking for overridden method " + superMethod); } Object probe; if (originalQuery instanceof XMethod) { probe = superMethod; } else if (originalQuery instanceof XMethodParameter) { probe = new XMethodParameter(superMethod, ((XMethodParameter) originalQuery).getParameterNumber()); } else { throw new IllegalStateException("impossible"); } n = getResolvedAnnotation(probe, getMinimal); return n; } catch (RuntimeException e) { AnalysisContext.logError("Exception while looking for annotation of " + originalMethod + "in " + classToLookIn, e); return null; } }
className = m.getClassName(); } else if (o instanceof XMethodParameter) { m = ((XMethodParameter) o).getMethod();
@Override public NullnessAnnotation getResolvedAnnotation(Object o, boolean getMinimal) { Profiler profiler = Global.getAnalysisCache().getProfiler(); profiler.start(this.getClass()); try { if (DEBUG) { System.out.println("getResolvedAnnotation: o=" + o + "..."); } TypeQualifierAnnotation tqa = null; if (o instanceof XMethodParameter) { XMethodParameter param = (XMethodParameter) o; tqa = TypeQualifierApplications.getEffectiveTypeQualifierAnnotation(param.getMethod(), param.getParameterNumber(), nonnullTypeQualifierValue); } else if (o instanceof XMethod || o instanceof XField) { tqa = TypeQualifierApplications.getEffectiveTypeQualifierAnnotation((AnnotatedObject) o, nonnullTypeQualifierValue); } NullnessAnnotation result = toNullnessAnnotation(tqa); if (DEBUG) { if (result == null) { System.out.println(" ===> not found"); } else { System.out.println(" ===> " + tqa + "/" + result.toString() ); } } return result; } finally { profiler.end(this.getClass()); } }
@Override public void visitSyntheticParameterAnnotation(int p, boolean runtimeVisible) { if (database == null) { return; } XMethod xmethod = XFactory.createXMethod(this); XMethodParameter xparameter = new XMethodParameter(xmethod, p); database.addDirectAnnotation(xparameter, NullnessAnnotation.UNKNOWN_NULLNESS); }
if (o instanceof XMethodParameter) { XMethodParameter mp = (XMethodParameter) o; XMethod m = mp.getMethod(); int parameterNumber = mp.getParameterNumber(); if (parameterNumber == 0) { if ("equals".equals(m.getName()) && "(Ljava/lang/Object;)Z".equals(m.getSignature()) && !m.isStatic()) {
@Override public void visitParameterAnnotation(int p, String annotationClass, Map<String, ElementValue> map, boolean runtimeVisible) { if (database == null) { return; } NullnessAnnotation n = NullnessAnnotation.Parser.parse(annotationClass); annotationClass = lastPortion(annotationClass); if (n == null) { return; } XMethod xmethod = XFactory.createXMethod(this); if (DEBUG) { System.out.println("Parameter " + p + " @" + annotationClass.substring(annotationClass.lastIndexOf('/') + 1) + " in " + xmethod.toString()); } XMethodParameter xparameter = new XMethodParameter(xmethod, p); database.addDirectAnnotation(xparameter, n); }
XMethodParameter mp = pu.getNonNullParameter(); if (mp != null) { invokedXMethod = mp.getMethod(); for (Location derefLoc : derefLocationSet) { if (safeCallToPrimateParseMethod(invokedXMethod, derefLoc)) { invokedMethod = MethodAnnotation.fromXMethod(mp.getMethod()); if (mp.getParameterNumber() == 0 && TypeQualifierNullnessAnnotationDatabase.assertsFirstParameterIsNonnull(invokedXMethod)) { return; parameterNumber = mp.getParameterNumber(); bugType = "NP_NULL_PARAM_DEREF";
@Override public boolean parameterMustBeNonNull(XMethod m, int param) { if (param == 0) { if ("equals".equals(m.getName()) && "(Ljava/lang/Object;)Z".equals(m.getSignature()) && !m.isStatic()) { return false; } else if ("main".equals(m.getName()) && "([Ljava/lang/String;)V".equals(m.getSignature()) && m.isStatic() && m.isPublic()) { return true; } else if (TypeQualifierNullnessAnnotationDatabase.assertsFirstParameterIsNonnull(m)) { return true; } else if ("compareTo".equals(m.getName()) && m.getSignature().endsWith(";)Z") && !m.isStatic()) { return true; } } if (!anyAnnotations(NullnessAnnotation.NONNULL)) { return false; } XMethodParameter xmp = new XMethodParameter(m, param); NullnessAnnotation resolvedAnnotation = getResolvedAnnotation(xmp, true); return resolvedAnnotation == NullnessAnnotation.NONNULL; }
public @CheckForNull NullnessAnnotation getDirectAnnotation(Object o) { Profiler profiler = Global.getAnalysisCache().getProfiler(); profiler.start(this.getClass()); try { if (DEBUG) { System.out.println("getDirectAnnotation: o=" + o + "..."); } TypeQualifierAnnotation tqa = null; if (o instanceof XMethodParameter) { XMethodParameter param = (XMethodParameter) o; tqa = TypeQualifierApplications.getDirectTypeQualifierAnnotation(param.getMethod(), param.getParameterNumber(), nonnullTypeQualifierValue); } else if (o instanceof XMethod || o instanceof XField) { tqa = TypeQualifierApplications.getEffectiveTypeQualifierAnnotation((AnnotatedObject) o, nonnullTypeQualifierValue); } NullnessAnnotation result = toNullnessAnnotation(tqa); if (DEBUG) { if (result == null) { System.out.println(" ===> not found"); } else { System.out.println(" ===> " + tqa + "/" + result.toString() ); } } return result; } finally { profiler.end(this.getClass()); } }
protected void addMethodParameterAnnotation(String cName, String mName, String mSig, boolean isStatic, int param, AnnotationEnum annotation) { // if (!Subtypes.DO_NOT_USE) { // subtypes.addNamedClass(cName); // } if (addClassOnly) { return; } SignatureParser parser = new SignatureParser(mSig); if (param < 0 || param >= parser.getNumParameters()) { throw new IllegalArgumentException("can't annotation parameter #" + param + " of " + cName + "." + mName + mSig); } String signature = parser.getParameter(param); char firstChar = signature.charAt(0); boolean isReference = firstChar == 'L' || firstChar == '['; if (onlyAppliesToReferenceParameters(annotation) && !isReference) { AnalysisContext.logError("Can't apply " + annotation + " to parameter " + param + " with signature " + signature + " of " + cName + "." + mName + " : " + mSig); return; } XMethod m = XFactory.createXMethod(cName, mName, mSig, isStatic); addDirectAnnotation(new XMethodParameter(m, param), annotation); } }
@Override public NullnessAnnotation getResolvedAnnotation(Object o, boolean getMinimal) { Profiler profiler = Global.getAnalysisCache().getProfiler(); profiler.start(this.getClass()); try { if (DEBUG) { System.out.println("getResolvedAnnotation: o=" + o + "..."); } TypeQualifierAnnotation tqa = null; if (o instanceof XMethodParameter) { XMethodParameter param = (XMethodParameter) o; tqa = TypeQualifierApplications.getEffectiveTypeQualifierAnnotation(param.getMethod(), param.getParameterNumber(), nonnullTypeQualifierValue); } else if (o instanceof XMethod || o instanceof XField) { tqa = TypeQualifierApplications.getEffectiveTypeQualifierAnnotation((AnnotatedObject) o, nonnullTypeQualifierValue); } NullnessAnnotation result = toNullnessAnnotation(tqa); if (DEBUG) { if (result == null) { System.out.println(" ===> not found"); } else { System.out.println(" ===> " + tqa + "/" + result.toString() ); } } return result; } finally { profiler.end(this.getClass()); } }
IsNullValue value; XMethodParameter methodParameter = new XMethodParameter(xm, paramIndex); NullnessAnnotation n = db.getResolvedAnnotation(methodParameter, false); if (n == NullnessAnnotation.CHECK_FOR_NULL) {
if (o instanceof XMethodParameter) { XMethodParameter mp = (XMethodParameter) o; XMethod m = mp.getMethod(); int parameterNumber = mp.getParameterNumber(); if (parameterNumber == 0) { if ("equals".equals(m.getName()) && "(Ljava/lang/Object;)Z".equals(m.getSignature()) && !m.isStatic()) {
@Override public @CheckForNull XMethodParameter getNonNullParameter() { return new XMethodParameter(m, param); }
XMethodParameter mp = pu.getNonNullParameter(); if (mp != null) { invokedXMethod = mp.getMethod(); for (Location derefLoc : derefLocationSet) { if (safeCallToPrimateParseMethod(invokedXMethod, derefLoc)) { invokedMethod = MethodAnnotation.fromXMethod(mp.getMethod()); if (mp.getParameterNumber() == 0 && TypeQualifierNullnessAnnotationDatabase.assertsFirstParameterIsNonnull(invokedXMethod)) { return; parameterNumber = mp.getParameterNumber(); bugType = "NP_NULL_PARAM_DEREF";
@Override public void visitSyntheticParameterAnnotation(int p, boolean runtimeVisible) { if (database == null) { return; } XMethod xmethod = XFactory.createXMethod(this); XMethodParameter xparameter = new XMethodParameter(xmethod, p); database.addDirectAnnotation(xparameter, NullnessAnnotation.UNKNOWN_NULLNESS); }