001: /*
002: * FindBugs - Find Bugs in Java programs
003: * Copyright (C) 2003-2007 University of Maryland
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018: */
019:
020: package edu.umd.cs.findbugs.ba;
021:
022: /**
023: * @author David Hovemeyer
024: */
025: public class DefaultNullnessAnnotations {
026: /**
027: * Add default NullnessAnnotations to given INullnessAnnotationDatabase.
028: *
029: * @param database an INullnessAnnotationDatabase
030: */
031: public static void addDefaultNullnessAnnotations(
032: INullnessAnnotationDatabase database) {
033: if (AnnotationDatabase.IGNORE_BUILTIN_ANNOTATIONS) {
034: return;
035: }
036:
037: boolean missingClassWarningsSuppressed = AnalysisContext
038: .currentAnalysisContext()
039: .setMissingClassWarningsSuppressed(true);
040:
041: database.addDefaultAnnotation(AnnotationDatabase.Target.METHOD,
042: "java.lang.String", NullnessAnnotation.NONNULL);
043: database.addFieldAnnotation("java.lang.System", "out",
044: "Ljava/io/PrintStream;", true,
045: NullnessAnnotation.NONNULL);
046: database
047: .addFieldAnnotation(
048: "java.lang.System",
049: "http://sourceforge.net/tracker/index.php?func=detail&aid=1795838&group_id=96405&atid=614693err",
050: "Ljava/io/PrintStream;", true,
051: NullnessAnnotation.NONNULL);
052: database.addFieldAnnotation("java.lang.System", "in",
053: "Ljava/io/InputStream;", true,
054: NullnessAnnotation.NONNULL);
055:
056: database.addMethodAnnotation("java.lang.Class", "newInstance",
057: "()Ljava/lang/Object;", false,
058: NullnessAnnotation.NONNULL);
059: database.addMethodAnnotation("java.lang.Class", "forName",
060: "(Ljava/lang/String;)Ljava/lang/Class;", true,
061: NullnessAnnotation.NONNULL);
062: database.addMethodAnnotation("java.lang.reflect.Method",
063: "getParameterTypes", "()[Ljava/lang/Class;", false,
064: NullnessAnnotation.NONNULL);
065: database.addMethodAnnotation("java.lang.Object", "clone",
066: "()Ljava/lang/Object;", false,
067: NullnessAnnotation.NONNULL);
068: database.addMethodAnnotation("java.lang.Object", "toString",
069: "()Ljava/lang/String;", false,
070: NullnessAnnotation.NONNULL);
071: database.addMethodAnnotation("java.lang.Object", "getClass",
072: "()Ljava/lang/Class;", false,
073: NullnessAnnotation.NONNULL);
074:
075: database.addMethodParameterAnnotation("java.lang.Object",
076: "equals", "(Ljava/lang/Object;)Z", false, 0,
077: NullnessAnnotation.CHECK_FOR_NULL);
078: database.addMethodParameterAnnotation("java.util.Arrays",
079: "asList", "([Ljava/lang/Object;)Ljava/util/List;",
080: true, 0, NullnessAnnotation.NONNULL);
081: database.addMethodParameterAnnotation("java.lang.Integer",
082: "<init>", "(Ljava/lang/String;)Z", false, 0,
083: NullnessAnnotation.NONNULL);
084: database.addMethodParameterAnnotation("java.lang.Integer",
085: "parseInt", "(Ljava/lang/String;I)I", true, 0,
086: NullnessAnnotation.NONNULL);
087: database.addMethodParameterAnnotation("java.lang.Integer",
088: "parseInt", "(Ljava/lang/String;)I", true, 0,
089: NullnessAnnotation.NONNULL);
090:
091: database.addDefaultAnnotation(
092: AnnotationDatabase.Target.PARAMETER,
093: "java.util.concurrent.package-info",
094: NullnessAnnotation.NONNULL);
095: database.addDefaultAnnotation(
096: AnnotationDatabase.Target.PARAMETER,
097: "java.util.concurrent.CopyOnWriteArrayList",
098: NullnessAnnotation.UNKNOWN_NULLNESS);
099: database.addDefaultAnnotation(
100: AnnotationDatabase.Target.PARAMETER,
101: "java.util.concurrent.CopyOnWriteArraySet",
102: NullnessAnnotation.UNKNOWN_NULLNESS);
103: database.addDefaultAnnotation(
104: AnnotationDatabase.Target.PARAMETER,
105: "java.util.concurrent.ConcurrentLinkedQueue$Node",
106: NullnessAnnotation.UNKNOWN_NULLNESS);
107: database.addDefaultAnnotation(
108: AnnotationDatabase.Target.PARAMETER,
109: "java.util.concurrent.Exchanger",
110: NullnessAnnotation.UNKNOWN_NULLNESS);
111: database.addDefaultAnnotation(
112: AnnotationDatabase.Target.PARAMETER,
113: "java.util.concurrent.FutureTask",
114: NullnessAnnotation.UNKNOWN_NULLNESS);
115: database.addDefaultAnnotation(
116: AnnotationDatabase.Target.PARAMETER,
117: "java.util.concurrent.LinkedBlockingQueue$Node",
118: NullnessAnnotation.UNKNOWN_NULLNESS);
119: database
120: .addDefaultAnnotation(
121: AnnotationDatabase.Target.PARAMETER,
122: "java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask",
123: NullnessAnnotation.UNKNOWN_NULLNESS);
124: database.addDefaultAnnotation(
125: AnnotationDatabase.Target.PARAMETER,
126: "java.util.concurrent.SynchronousQueue$WaitQueue",
127: NullnessAnnotation.UNKNOWN_NULLNESS);
128: database.addDefaultAnnotation(
129: AnnotationDatabase.Target.PARAMETER,
130: "java.util.concurrent.SynchronousQueue$Node",
131: NullnessAnnotation.UNKNOWN_NULLNESS);
132: database.addDefaultAnnotation(
133: AnnotationDatabase.Target.PARAMETER,
134: "java.util.concurrent.ThreadPoolExecutor$Worker",
135: NullnessAnnotation.UNKNOWN_NULLNESS);
136:
137: database.addDefaultAnnotation(
138: AnnotationDatabase.Target.PARAMETER,
139: "java.util.concurrent.AbstractExecutorService",
140: NullnessAnnotation.UNKNOWN_NULLNESS);
141: database
142: .addDefaultAnnotation(
143: AnnotationDatabase.Target.PARAMETER,
144: "java.util.concurrent.ConcurrentSkipListMap$ConcurrentSkipListSubMap",
145: NullnessAnnotation.UNKNOWN_NULLNESS);
146: database.addDefaultAnnotation(
147: AnnotationDatabase.Target.PARAMETER,
148: "java.util.concurrent.ConcurrentSkipListMap$HeadIndex",
149: NullnessAnnotation.UNKNOWN_NULLNESS);
150:
151: database.addDefaultAnnotation(
152: AnnotationDatabase.Target.PARAMETER,
153: "java.util.concurrent.ConcurrentSkipListMap$Index",
154: NullnessAnnotation.UNKNOWN_NULLNESS);
155: database.addDefaultAnnotation(
156: AnnotationDatabase.Target.PARAMETER,
157: "java.util.concurrent.ConcurrentSkipListMap$Node",
158: NullnessAnnotation.UNKNOWN_NULLNESS);
159: database.addDefaultAnnotation(
160: AnnotationDatabase.Target.PARAMETER,
161: "java.util.concurrent.ConcurrentSkipListMap$SubMap",
162: NullnessAnnotation.UNKNOWN_NULLNESS);
163: database
164: .addDefaultAnnotation(
165: AnnotationDatabase.Target.PARAMETER,
166: "java.util.concurrent.ConcurrentSkipListSet$ConcurrentSkipListSubSet",
167: NullnessAnnotation.UNKNOWN_NULLNESS);
168: database.addDefaultAnnotation(
169: AnnotationDatabase.Target.PARAMETER,
170: "java.util.concurrent.LinkedBlockingDeque$Node",
171: NullnessAnnotation.UNKNOWN_NULLNESS);
172: database.addDefaultAnnotation(
173: AnnotationDatabase.Target.PARAMETER,
174: "java.util.concurrent.SynchronousQueue$TransferQueue",
175: NullnessAnnotation.UNKNOWN_NULLNESS);
176: database
177: .addDefaultAnnotation(
178: AnnotationDatabase.Target.PARAMETER,
179: "java.util.concurrent.SynchronousQueue$TransferQueue$QNode",
180: NullnessAnnotation.UNKNOWN_NULLNESS);
181: database.addDefaultAnnotation(
182: AnnotationDatabase.Target.PARAMETER,
183: "java.util.concurrent.SynchronousQueue$TransferStack",
184: NullnessAnnotation.UNKNOWN_NULLNESS);
185: database.addDefaultAnnotation(
186: AnnotationDatabase.Target.PARAMETER,
187: "java.util.concurrent.SynchronousQueue$Transferer",
188: NullnessAnnotation.UNKNOWN_NULLNESS);
189:
190: database.addMethodParameterAnnotation(
191: "java.util.concurrent.FutureTask", "<init>",
192: "(Ljava/lang/Runnable;Ljava/lang/Object;)V", false, 1,
193: NullnessAnnotation.CHECK_FOR_NULL);
194: database
195: .addMethodParameterAnnotation(
196: "java.util.concurrent.Executors",
197: "callable",
198: "(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Callable;",
199: true, 1, NullnessAnnotation.CHECK_FOR_NULL);
200:
201: database.addMethodParameterAnnotation(
202: "java.util.concurrent.ThreadPoolExecutor", "addWorker",
203: "(Ljava/lang/Runnable;Z)Z", false, 0,
204: NullnessAnnotation.CHECK_FOR_NULL);
205:
206: database
207: .addMethodParameterAnnotation(
208: "java.util.concurrent.ConcurrentHashMap$Segment",
209: "remove",
210: "(Ljava/lang/Object;ILjava/lang/Object;)Ljava/lang/Object;",
211: false, 2, NullnessAnnotation.CHECK_FOR_NULL);
212: database.addMethodParameterAnnotation(
213: "java.util.concurrent.CyclicBarrier", "<init>",
214: "(ILjava/lang/Runnable;)V", false, 1,
215: NullnessAnnotation.CHECK_FOR_NULL);
216: database.addMethodParameterAnnotation(
217: "java.util.concurrent.Executors$RunnableAdapter",
218: "<init>", "(Ljava/lang/Runnable;Ljava/lang/Object;)V",
219: false, 1, NullnessAnnotation.CHECK_FOR_NULL);
220: database
221: .addMethodParameterAnnotation(
222: "java.util.concurrent.ConcurrentSkipListMap",
223: "doRemove",
224: "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
225: false, 1, NullnessAnnotation.CHECK_FOR_NULL);
226: database.addMethodAnnotation(
227: "java.util.concurrent.ConcurrentHashMap", "get",
228: "(Ljava/lang/Object;)Ljava/lang/Object;", false,
229: NullnessAnnotation.CHECK_FOR_NULL);
230: database.addMethodAnnotation(
231: "java.util.concurrent.ConcurrentHashMap", "remove",
232: "(Ljava/lang/Object;)Ljava/lang/Object;", false,
233: NullnessAnnotation.CHECK_FOR_NULL);
234: database
235: .addMethodAnnotation(
236: "java.util.concurrent.ConcurrentHashMap",
237: "putIfAbsent",
238: "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
239: false, NullnessAnnotation.CHECK_FOR_NULL);
240:
241: database.addMethodAnnotation(
242: "java.util.concurrent.locks.ReadWriteLock", "readLock",
243: "()Ljava/util/concurrent/locks/Lock;", false,
244: NullnessAnnotation.NONNULL);
245: database.addMethodAnnotation(
246: "java.util.concurrent.locks.ReadWriteLock",
247: "writeLock", "()Ljava/util/concurrent/locks/Lock;",
248: false, NullnessAnnotation.NONNULL);
249: database
250: .addMethodAnnotation(
251: "java.util.concurrent.locks.ReentrantReadWriteLock",
252: "readLock",
253: "()Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;",
254: false, NullnessAnnotation.NONNULL);
255: database
256: .addMethodAnnotation(
257: "java.util.concurrent.locks.ReentrantReadWriteLock",
258: "writeLock",
259: "()Ljava/util/concurrent/locks/()Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;",
260: false, NullnessAnnotation.NONNULL);
261:
262: database
263: .addMethodParameterAnnotation(
264: "java.util.concurrent.ExecutorService",
265: "submit",
266: "(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;",
267: false, 1, NullnessAnnotation.CHECK_FOR_NULL);
268: database
269: .addMethodParameterAnnotation(
270: "java.util.concurrent.AbstractExecutorService",
271: "submit",
272: "(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;",
273: false, 1, NullnessAnnotation.CHECK_FOR_NULL);
274: database
275: .addMethodParameterAnnotation(
276: "java.util.concurrent.ExecutorCompletionService",
277: "submit",
278: "(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;",
279: false, 1, NullnessAnnotation.CHECK_FOR_NULL);
280: database
281: .addMethodParameterAnnotation(
282: "java.util.concurrent.AbstractExecutorServiceNullnessAnnotationDatabase",
283: "newTaskFor",
284: "(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;",
285: false, 1, NullnessAnnotation.CHECK_FOR_NULL);
286: database
287: .addMethodParameterAnnotation(
288: "java.util.concurrent.ExecutorCompletionService",
289: "newTaskFor",
290: "(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/RunnableFuture;",
291: false, 1, NullnessAnnotation.CHECK_FOR_NULL);
292:
293: database.addMethodParameterAnnotation(
294: "java.util.concurrent.ThreadPoolExecutor",
295: "addIfUnderCorePoolSize", "(Ljava/lang/Runnable;)Z",
296: false, 0, NullnessAnnotation.CHECK_FOR_NULL);
297: database.addMethodParameterAnnotation(
298: "java.util.concurrent.ThreadPoolExecutor", "addThread",
299: "(Ljava/lang/Runnable;)Ljava/lang/Thread;", false, 0,
300: NullnessAnnotation.CHECK_FOR_NULL);
301: database.addMethodParameterAnnotation(
302: "java.util.concurrent.ThreadPoolExecutor",
303: "afterExecute",
304: "(Ljava/lang/Runnable;Ljava/lang/Throwable;)V", false,
305: 1, NullnessAnnotation.CHECK_FOR_NULL);
306:
307: database.addMethodParameterAnnotation("java.util.EnumMap",
308: "get", "(Ljava/lang/Object;)Ljava/lang/Object;", false,
309: 0, NullnessAnnotation.NONNULL);
310: database.addMethodParameterAnnotation("java.util.EnumMap",
311: "containsKey",
312: "(Ljava/lang/Object;)Ljava/lang/Object;", false, 0,
313: NullnessAnnotation.NONNULL);
314: database
315: .addMethodParameterAnnotation(
316: "java.util.EnumMap",
317: "put",
318: "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
319: false, 0, NullnessAnnotation.NONNULL);
320: database.addMethodParameterAnnotation("java.util.EnumMap",
321: "remove", "(Ljava/lang/Object;)Ljava/lang/Object;",
322: false, 0, NullnessAnnotation.NONNULL);
323:
324: database.addMethodParameterAnnotation("java.util.SortedMap",
325: "get", "(Ljava/lang/Object;)Ljava/lang/Object;", false,
326: 0, NullnessAnnotation.NONNULL);
327: database.addMethodParameterAnnotation("java.util.SortedMap",
328: "containsKey",
329: "(Ljava/lang/Object;)Ljava/lang/Object;", false, 0,
330: NullnessAnnotation.NONNULL);
331: database
332: .addMethodParameterAnnotation(
333: "java.util.SortedMap",
334: "put",
335: "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
336: false, 0, NullnessAnnotation.NONNULL);
337: database.addMethodParameterAnnotation("java.util.SortedMap",
338: "remove", "(Ljava/lang/Object;)Ljava/lang/Object;",
339: false, 0, NullnessAnnotation.NONNULL);
340:
341: database.addMethodParameterAnnotation("java.util.SortedSet",
342: "add", "(Ljava/lang/Object;)Z", false, 0,
343: NullnessAnnotation.NONNULL);
344: database.addMethodParameterAnnotation("java.util.SortedSet",
345: "remove", "(Ljava/lang/Object;)Z", false, 0,
346: NullnessAnnotation.NONNULL);
347: database.addMethodParameterAnnotation("java.util.SortedSet",
348: "cotains", "(Ljava/lang/Object;)Z", false, 0,
349: NullnessAnnotation.NONNULL);
350:
351: // addMethodAnnotation("java.util.Queue", "poll", "()Ljava/lang/Object;", false, NullnessAnnotation.CHECK_FOR_NULL);
352: database.addMethodAnnotation("java.io.BufferedReader",
353: "readLine", "()Ljava/lang/String;", false,
354: NullnessAnnotation.CHECK_FOR_NULL);
355:
356: AnalysisContext.currentAnalysisContext()
357: .setMissingClassWarningsSuppressed(
358: missingClassWarningsSuppressed);
359:
360: }
361: }
|