1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import org.apache.bcel.Repository; 23 import org.apache.bcel.classfile.JavaClass; 24 25 28 public class CheckReturnAnnotationDatabase extends AnnotationDatabase<CheckReturnValueAnnotation> { 29 30 private JavaClass throwableClass, threadClass; 31 public CheckReturnAnnotationDatabase() { 32 setAddClassOnly(true); 33 loadAuxiliaryAnnotations(); 34 setAddClassOnly(false); 35 } 36 37 @Override 38 public void loadAuxiliaryAnnotations() { 39 boolean missingClassWarningsSuppressed = AnalysisContext.currentAnalysisContext().setMissingClassWarningsSuppressed(true); 40 41 addMethodAnnotation("java.util.Iterator","hasNext", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 42 addMethodAnnotation("java.io.File","createNewFile", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_LOW); 43 addMethodAnnotation("java.io.DataInputStream","skipBytes", "(I)I", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 44 addMethodAnnotation("java.util.Enumeration","hasMoreElements", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 45 addMethodAnnotation("java.security.MessageDigest","digest", "([B)[B", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 46 47 addMethodAnnotation("java.util.concurrent.locks.ReadWriteLock","readLock", "()Ljava/util/concurrent/locks/Lock;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 48 addMethodAnnotation("java.util.concurrent.locks.ReadWriteLock","writeLock", "()Ljava/util/concurrent/locks/Lock;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 49 addMethodAnnotation("java.util.concurrent.locks.Condition", "await", "(JLjava/util/concurrent/TimeUnit;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 50 addMethodAnnotation("java.util.concurrent.locks.Condition", "awaitUtil", "(Ljava/util/Date;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 51 addMethodAnnotation("java.util.concurrent.locks.Condition", "awaitNanos", "(J)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 52 addMethodAnnotation("java.util.concurrent.Semaphore", "tryAcquire", "(JLjava/util/concurrent/TimeUnit;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 53 addMethodAnnotation("java.util.concurrent.Semaphore", "tryAcquire", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 54 addMethodAnnotation("java.util.concurrent.locks.Lock", "tryLock", "(JLjava/util/concurrent/TimeUnit;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 55 addMethodAnnotation("java.util.concurrent.locks.Lock", "newCondition","()Ljava/util/concurrent/locks/Condition;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 56 addMethodAnnotation("java.util.concurrent.locks.Lock", "tryLock", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 57 addMethodAnnotation("java.util.concurrent.BlockingQueue", "offer", "(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 58 59 addMethodAnnotation("java.util.ConcurrentLinkedQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 60 addMethodAnnotation("java.util.DelayQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 61 addMethodAnnotation("java.util.LinkedBlockingQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_LOW); 62 addMethodAnnotation("java.util.LinkedList", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 63 addMethodAnnotation("java.util.Queue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_LOW); 64 addMethodAnnotation("java.util.ArrayBlockingQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 65 addMethodAnnotation("java.util.SynchronousQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 66 addMethodAnnotation("java.util.PriorityQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 67 addMethodAnnotation("java.util.PriorityBlockingQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 68 69 70 addMethodAnnotation("java.util.concurrent.BlockingQueue", "poll", "(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 71 addMethodAnnotation("java.util.Queue", "poll", "()Ljava/lang/Object;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 72 73 addDefaultMethodAnnotation("java.lang.String", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 74 addMethodAnnotation("java.lang.String", "getBytes", "(Ljava/lang/String;)[B", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 75 addMethodAnnotation("java.lang.String", "<init>", "([BLjava/lang/String;)V", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 76 addDefaultMethodAnnotation("java.math.BigDecimal", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 77 addMethodAnnotation("java.math.BigDecimal", "inflate", "()Ljava/math/BigDecimal;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 78 addDefaultMethodAnnotation("java.math.BigInteger", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 79 addMethodAnnotation("java.math.BigInteger", "addOne", "([IIII)I", true, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 80 addMethodAnnotation("java.math.BigInteger", "subN", "([I[II)I", true, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE); 81 addDefaultMethodAnnotation("java.sql.Connection", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH); 82 addDefaultMethodAnnotation("java.net.InetAddress", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM); 83 AnalysisContext.currentAnalysisContext().setMissingClassWarningsSuppressed(missingClassWarningsSuppressed); 84 85 try { 86 throwableClass = Repository.lookupClass("java.lang.Throwable"); 87 } catch (ClassNotFoundException e) { 88 AnalysisContext.reportMissingClass(e); 89 } 90 try { 91 threadClass = Repository.lookupClass("java.lang.Thread"); 92 } catch (ClassNotFoundException e) { 93 AnalysisContext.reportMissingClass(e); 94 } 95 } 96 97 @Override 98 public CheckReturnValueAnnotation getResolvedAnnotation(Object o, boolean getMinimal) { 99 if (!(o instanceof XMethod)) 100 return null; 101 XMethod m = (XMethod) o; 102 if (m.getName().startsWith("access$")) return null; 103 else if (m.getName().equals("<init>")) { 104 try { 105 if (throwableClass != null && Repository.instanceOf(m.getClassName(), throwableClass)) 106 return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_VERY_HIGH; 107 } catch (ClassNotFoundException e) { 108 AnalysisContext.reportMissingClass(e); 109 } 110 if (m.getClassName().equals("java.lang.Thread")) 111 return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_VERY_HIGH; 112 try { 113 114 if (threadClass != null && Repository.instanceOf(m.getClassName(), threadClass)) 115 return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH; 116 } catch (ClassNotFoundException e) { 117 AnalysisContext.reportMissingClass(e); 118 } 119 } else if (m.getName().equals("equals") && m.getSignature().equals("(Ljava/lang/Object;)Z") 120 && !m.isStatic()) 121 return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM; 122 else if (m.getSignature().endsWith(")Ljava/lang/String;") 123 && (m.getClassName().equals("java.lang.StringBuffer") || m.getClassName().equals( 124 "java.lang.StringBuilder"))) 125 return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM; 126 return super.getResolvedAnnotation(o, getMinimal); 127 } 128 129 } 130 | Popular Tags |