001: /*
002: * FindBugs - Find Bugs in Java programs
003: * Copyright (C) 2006, 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.npe;
021:
022: import edu.umd.cs.findbugs.annotations.CheckForNull;
023: import edu.umd.cs.findbugs.ba.XField;
024: import edu.umd.cs.findbugs.ba.XMethod;
025: import edu.umd.cs.findbugs.ba.XMethodParameter;
026:
027: /**
028: * @author pugh
029: */
030: public abstract class PointerUsageRequiringNonNullValue {
031:
032: public abstract String getDescription();
033:
034: public boolean isDirect() {
035: return false;
036: }
037:
038: public boolean getReturnFromNonNullMethod() {
039: return false;
040: }
041:
042: public @CheckForNull
043: XMethodParameter getNonNullParameter() {
044: return null;
045: }
046:
047: public @CheckForNull
048: XField getNonNullField() {
049: return null;
050: }
051:
052: private static final PointerUsageRequiringNonNullValue instance = new PointerUsageRequiringNonNullValue() {
053: @Override
054: public boolean isDirect() {
055: return true;
056: }
057:
058: @Override
059: public String getDescription() {
060: return "SOURCE_LINE_DEREF";
061: }
062: };
063:
064: private static final PointerUsageRequiringNonNullValue nonNullReturnInstance = new PointerUsageRequiringNonNullValue() {
065: @Override
066: public boolean getReturnFromNonNullMethod() {
067: return true;
068: }
069:
070: @Override
071: public String getDescription() {
072: return "SOURCE_LINE_RETURNED";
073: }
074: };
075:
076: public static PointerUsageRequiringNonNullValue getPointerDereference() {
077: return instance;
078: }
079:
080: public static PointerUsageRequiringNonNullValue getReturnFromNonNullMethod(
081: XMethod m) {
082: return nonNullReturnInstance;
083: }
084:
085: public static PointerUsageRequiringNonNullValue getPassedAsNonNullParameter(
086: final XMethod m, final int param) {
087: return new PointerUsageRequiringNonNullValue() {
088: @Override
089: public @CheckForNull
090: XMethodParameter getNonNullParameter() {
091: return new XMethodParameter(m, param);
092: }
093:
094: @Override
095: public String getDescription() {
096: return "SOURCE_LINE_INVOKED";
097: }
098:
099: };
100: }
101:
102: public static PointerUsageRequiringNonNullValue getStoredIntoNonNullField(
103: final XField f) {
104: return new PointerUsageRequiringNonNullValue() {
105: @Override
106: public @CheckForNull
107: XField getNonNullField() {
108: return f;
109: }
110:
111: @Override
112: public String getDescription() {
113: return "SOURCE_LINE_STORED";
114: }
115:
116: };
117: }
118: }
|