edu.umd.cs.findbugs
Class FindBugs

java.lang.Object
  extended by edu.umd.cs.findbugs.FindBugs
All Implemented Interfaces:
ExitCodes, Constants2, org.apache.bcel.Constants

public class FindBugs
extends java.lang.Object
implements Constants2, ExitCodes

An instance of this class is used to apply the selected set of analyses on some collection of Java classes. It also implements the comand line interface.

Author:
Bill Pugh, David Hovemeyer

Nested Class Summary
private static class FindBugs.ArchiveWorkListItem
          Work list item specifying a file/directory/URL containing class files to analyze.
private static class FindBugs.CategoryFilteringBugReporter
           
private static interface FindBugs.Chooser
          Handling callback for choose() method, used to implement the -chooseVisitors and -choosePlugins options.
private static interface FindBugs.ClassProducer
          Interface for an object representing a source of class files to analyze.
private  class FindBugs.DirectoryClassProducer
          ClassProducer for directories.
private static class FindBugs.ErrorCountingBugReporter
          A delegating bug reporter which counts reported bug instances, missing classes, and serious analysis errors.
private static class FindBugs.FindBugsCommandLine
          Helper class to parse the command line and create the FindBugs engine object.
private static class FindBugs.NoCloseInputStream
          Delegating InputStream wrapper that never closes the underlying input stream.
private  class FindBugs.SingleClassProducer
          ClassProducer for single class files.
private  class FindBugs.ZipClassProducer
          ClassProducer for zip/jar archives.
 
Field Summary
private  AnalysisContext analysisContext
           
private static java.util.Set<java.lang.String> archiveExtensionSet
          File extensions that indicate an archive (zip, jar, or similar).
private  FindBugs.ErrorCountingBugReporter bugReporter
           
private  java.util.List<ClassObserver> classObserverList
           
private  ClassScreener classScreener
           
private  java.lang.String currentClass
           
(package private) static boolean DEBUG
           
private  Detector[] detectors
           
private static int EMACS_REPORTER
           
private static java.lang.String home
          FindBugs home directory.
private static int HTML_REPORTER
           
private static java.util.Set<java.lang.String> knownURLProtocolSet
          Known URL protocols.
private static int PRINTING_REPORTER
           
private  FindBugsProgress progressCallback
           
private  Project project
           
private static int SORTING_REPORTER
           
private static int XDOCS_REPORTER
           
private static int XML_REPORTER
           
 
Fields inherited from interface org.apache.bcel.Constants
AALOAD, AASTORE, ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, ACCESS_NAMES, ACONST_NULL, ALOAD, ALOAD_0, ALOAD_1, ALOAD_2, ALOAD_3, ANEWARRAY, ANEWARRAY_QUICK, ARETURN, ARRAYLENGTH, ASTORE, ASTORE_0, ASTORE_1, ASTORE_2, ASTORE_3, ATHROW, ATTR_CODE, ATTR_CONSTANT_VALUE, ATTR_DEPRECATED, ATTR_EXCEPTIONS, ATTR_INNER_CLASSES, ATTR_LINE_NUMBER_TABLE, ATTR_LOCAL_VARIABLE_TABLE, ATTR_PMG, ATTR_SIGNATURE, ATTR_SOURCE_FILE, ATTR_STACK_MAP, ATTR_SYNTHETIC, ATTR_UNKNOWN, ATTRIBUTE_NAMES, BALOAD, BASTORE, BIPUSH, BREAKPOINT, CALOAD, CASTORE, CHECKCAST, CHECKCAST_QUICK, CLASS_TYPE_NAMES, CONSTANT_Class, CONSTANT_Double, CONSTANT_Fieldref, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodref, CONSTANT_Long, CONSTANT_Methodref, CONSTANT_NameAndType, CONSTANT_NAMES, CONSTANT_String, CONSTANT_Utf8, CONSTRUCTOR_NAME, CONSUME_STACK, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DLOAD_0, DLOAD_1, DLOAD_2, DLOAD_3, DMUL, DNEG, DREM, DRETURN, DSTORE, DSTORE_0, DSTORE_1, DSTORE_2, DSTORE_3, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAD_0, FLOAD_1, FLOAD_2, FLOAD_3, FMUL, FNEG, FREM, FRETURN, FSTORE, FSTORE_0, FSTORE_1, FSTORE_2, FSTORE_3, FSUB, GETFIELD, GETFIELD_QUICK, GETFIELD_QUICK_W, GETFIELD2_QUICK, GETSTATIC, GETSTATIC_QUICK, GETSTATIC2_QUICK, GOTO, GOTO_W, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILLEGAL_OPCODE, ILLEGAL_TYPE, ILOAD, ILOAD_0, ILOAD_1, ILOAD_2, ILOAD_3, IMPDEP1, IMPDEP2, IMUL, INEG, INSTANCEOF, INSTANCEOF_QUICK, INT2BYTE, INT2CHAR, INT2SHORT, INTERFACES_IMPLEMENTED_BY_ARRAYS, INVOKEINTERFACE, INVOKEINTERFACE_QUICK, INVOKENONVIRTUAL, INVOKENONVIRTUAL_QUICK, INVOKESPECIAL, INVOKESTATIC, INVOKESTATIC_QUICK, INVOKESUPER_QUICK, INVOKEVIRTUAL, INVOKEVIRTUAL_QUICK, INVOKEVIRTUAL_QUICK_W, INVOKEVIRTUALOBJECT_QUICK, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISTORE_0, ISTORE_1, ISTORE_2, ISTORE_3, ISUB, ITEM_Bogus, ITEM_Double, ITEM_Float, ITEM_InitObject, ITEM_Integer, ITEM_Long, ITEM_NAMES, ITEM_NewObject, ITEM_Null, ITEM_Object, IUSHR, IXOR, JSR, JSR_W, KNOWN_ATTRIBUTES, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDC_QUICK, LDC_W, LDC_W_QUICK, LDC2_W, LDC2_W_QUICK, LDIV, LLOAD, LLOAD_0, LLOAD_1, LLOAD_2, LLOAD_3, LMUL, LNEG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSTORE_0, LSTORE_1, LSTORE_2, LSTORE_3, LSUB, LUSHR, LXOR, MAJOR, MAJOR_1_1, MAJOR_1_2, MAJOR_1_3, MAX_ACC_FLAG, MAX_BYTE, MAX_CODE_SIZE, MAX_CP_ENTRIES, MAX_SHORT, MINOR, MINOR_1_1, MINOR_1_2, MINOR_1_3, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, MULTIANEWARRAY_QUICK, NEW, NEW_QUICK, NEWARRAY, NO_OF_OPERANDS, NOP, OPCODE_NAMES, POP, POP2, PRODUCE_STACK, PUSH, PUTFIELD, PUTFIELD_QUICK, PUTFIELD_QUICK_W, PUTFIELD2_QUICK, PUTSTATIC, PUTSTATIC_QUICK, PUTSTATIC2_QUICK, RESERVED, RET, RETURN, SALOAD, SASTORE, SHORT_TYPE_NAMES, SIPUSH, STATIC_INITIALIZER_NAME, SWAP, SWITCH, T_ADDRESS, T_ARRAY, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_OBJECT, T_REFERENCE, T_SHORT, T_UNKNOWN, T_VOID, TABLESWITCH, TYPE_NAMES, TYPE_OF_OPERANDS, UNDEFINED, UNPREDICTABLE, WIDE
 
Fields inherited from interface edu.umd.cs.findbugs.ExitCodes
BUGS_FOUND_FLAG, ERROR_FLAG, MISSING_CLASS_FLAG
 
Constructor Summary
FindBugs(BugReporter bugReporter, Project project)
          Constructor.
 
Method Summary
 void addClassObserver(ClassObserver classObserver)
          Add a ClassObserver.
private  void addCollectionToClasspath(java.util.Collection<java.lang.String> collection, URLClassPathRepository repository)
          Add all classpath entries in given Collection to the given URLClassPathRepository.
private  void clearRepository()
          Clear the Repository and update it to reflect the classpath specified by the current project.
private  void createDetectors()
          Create Detectors for each DetectorFactory which is enabled.
private static FindBugs createEngine(FindBugs.FindBugsCommandLine commandLine, java.lang.String[] argv)
           
private  void examineClass(java.lang.String className)
          Examine a single class by invoking all of the Detectors on it.
 void execute()
          Execute FindBugs on the Project.
 AnalysisContext getAnalysisContext()
          Get the analysis context.
 int getBugCount()
          Get the number of bug instances that were reported during analysis.
 java.lang.String getCurrentClass()
          Get the name of the most recent class to be analyzed.
 int getErrorCount()
          Get the number of errors that occurred during analysis.
(package private) static java.lang.String getFileExtension(java.lang.String fileName)
          Get the file extension of given fileName.
static java.lang.String getHome()
          Get the FindBugs home directory.
 int getMissingClassCount()
          Get the number of time missing classes were reported during analysis.
(package private) static java.lang.String getURLProtocol(java.lang.String urlString)
          Get the URL protocol of given URL string.
private static java.util.Set<java.lang.String> handleBugCategories(java.lang.String categories)
          Process -bugCategories option.
(package private) static boolean isArchiveExtension(java.lang.String fileExtension)
          Determine if given file extension indicates an archive file.
static void main(java.lang.String[] argv)
           
private static org.apache.bcel.classfile.JavaClass parseClass(java.lang.String archiveName, java.io.InputStream in, java.lang.String fileName)
          Parse the data for a class to create a JavaClass object.
private static org.apache.bcel.classfile.JavaClass parseClass(java.net.URL url)
          Parse the data for a class to create a JavaClass object.
private static org.apache.bcel.classfile.JavaClass parseFromStream(java.io.InputStream in, java.lang.String fileName)
          Parse an input stream to produce a JavaClass object.
private  void reportFinal()
          Call report() on all detectors, to give them a chance to report any accumulated bug reports.
private  void reportRecoverableDetectorException(java.lang.String className, Detector detector, java.lang.Exception e)
           
private  void reportRecoverableException(java.lang.String className, java.lang.Exception e)
           
private static void runMain(FindBugs findBugs, FindBugs.FindBugsCommandLine commandLine)
           
private  void scanArchiveOrDirectory(FindBugs.ArchiveWorkListItem item, java.util.LinkedList<FindBugs.ArchiveWorkListItem> archiveWorkList, java.util.List<java.lang.String> repositoryClassList, java.util.List<java.lang.String> additionalAuxClasspathEntryList)
          Add all classes contained in given file or directory to the BCEL Repository.
 void setClassScreener(ClassScreener classScreener)
          Set the ClassScreener.
 void setFilter(java.lang.String filterFileName, boolean include)
          Set filter of bug instances to include or exclude.
static void setHome(java.lang.String home)
          Set the FindBugs home directory.
 void setProgressCallback(FindBugsProgress progressCallback)
          Set the progress callback that will be used to keep track of the progress of the analysis.
private  void setRepositoryClassPath(java.util.List<java.lang.String> additionalAuxClasspathEntryList)
          Based on Project settings, set the classpath to be used by the Repository when looking up classes.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

PRINTING_REPORTER

private static final int PRINTING_REPORTER
See Also:
Constant Field Values

SORTING_REPORTER

private static final int SORTING_REPORTER
See Also:
Constant Field Values

XML_REPORTER

private static final int XML_REPORTER
See Also:
Constant Field Values

EMACS_REPORTER

private static final int EMACS_REPORTER
See Also:
Constant Field Values

HTML_REPORTER

private static final int HTML_REPORTER
See Also:
Constant Field Values

XDOCS_REPORTER

private static final int XDOCS_REPORTER
See Also:
Constant Field Values

DEBUG

static final boolean DEBUG

home

private static java.lang.String home
FindBugs home directory.


archiveExtensionSet

private static final java.util.Set<java.lang.String> archiveExtensionSet
File extensions that indicate an archive (zip, jar, or similar).


knownURLProtocolSet

private static final java.util.Set<java.lang.String> knownURLProtocolSet
Known URL protocols. Filename URLs that do not have an explicit protocol are assumed to be files.


bugReporter

private FindBugs.ErrorCountingBugReporter bugReporter

project

private Project project

classObserverList

private java.util.List<ClassObserver> classObserverList

detectors

private Detector[] detectors

progressCallback

private FindBugsProgress progressCallback

classScreener

private ClassScreener classScreener

analysisContext

private AnalysisContext analysisContext

currentClass

private java.lang.String currentClass
Constructor Detail

FindBugs

public FindBugs(BugReporter bugReporter,
                Project project)
Constructor.

Parameters:
bugReporter - the BugReporter object that will be used to report BugInstance objects, analysis errors, class to source mapping, etc.
project - the Project indicating which files to analyze and the auxiliary classpath to use; note that the FindBugs object will create a private copy of the Project object
Method Detail

setProgressCallback

public void setProgressCallback(FindBugsProgress progressCallback)
Set the progress callback that will be used to keep track of the progress of the analysis.

Parameters:
progressCallback - the progress callback

setFilter

public void setFilter(java.lang.String filterFileName,
                      boolean include)
               throws java.io.IOException,
                      FilterException
Set filter of bug instances to include or exclude.

Parameters:
filterFileName - the name of the filter file
include - true if the filter specifies bug instances to include, false if it specifies bug instances to exclude
Throws:
java.io.IOException
FilterException

addClassObserver

public void addClassObserver(ClassObserver classObserver)
Add a ClassObserver.

Parameters:
classObserver - the ClassObserver

setClassScreener

public void setClassScreener(ClassScreener classScreener)
Set the ClassScreener. This object chooses which individual classes to analyze. By default, all classes are analyzed.

Parameters:
classScreener - the ClassScreener to use

execute

public void execute()
             throws java.io.IOException,
                    java.lang.InterruptedException
Execute FindBugs on the Project. All bugs found are reported to the BugReporter object which was set when this object was constructed.

Throws:
java.io.IOException - if an I/O exception occurs analyzing one of the files
java.lang.InterruptedException - if the thread is interrupted while conducting the analysis

getAnalysisContext

public AnalysisContext getAnalysisContext()
Get the analysis context. It is only valid to call this method after the execute() method has been called.


getCurrentClass

public java.lang.String getCurrentClass()
Get the name of the most recent class to be analyzed. This is useful for diagnosing an unexpected exception. Returns null if no class has been analyzed.


getBugCount

public int getBugCount()
Get the number of bug instances that were reported during analysis.


getErrorCount

public int getErrorCount()
Get the number of errors that occurred during analysis.


getMissingClassCount

public int getMissingClassCount()
Get the number of time missing classes were reported during analysis.


setHome

public static void setHome(java.lang.String home)
Set the FindBugs home directory.


getHome

public static java.lang.String getHome()
Get the FindBugs home directory.


createDetectors

private void createDetectors()
Create Detectors for each DetectorFactory which is enabled. This will populate the detectors array.


clearRepository

private void clearRepository()
Clear the Repository and update it to reflect the classpath specified by the current project.


setRepositoryClassPath

private void setRepositoryClassPath(java.util.List<java.lang.String> additionalAuxClasspathEntryList)
                             throws java.io.IOException
Based on Project settings, set the classpath to be used by the Repository when looking up classes.

Throws:
java.io.IOException

addCollectionToClasspath

private void addCollectionToClasspath(java.util.Collection<java.lang.String> collection,
                                      URLClassPathRepository repository)
Add all classpath entries in given Collection to the given URLClassPathRepository. Missing entries are not fatal: we'll log them as analysis errors, but the analysis can continue.

Parameters:
collection - classpath entries to add
repository - URLClassPathRepository to add the entries to

scanArchiveOrDirectory

private void scanArchiveOrDirectory(FindBugs.ArchiveWorkListItem item,
                                    java.util.LinkedList<FindBugs.ArchiveWorkListItem> archiveWorkList,
                                    java.util.List<java.lang.String> repositoryClassList,
                                    java.util.List<java.lang.String> additionalAuxClasspathEntryList)
                             throws java.io.IOException,
                                    java.lang.InterruptedException
Add all classes contained in given file or directory to the BCEL Repository.

Parameters:
item - work list item representing the file, which may be a jar/zip archive, a single class file, or a directory to be recursively searched for class files
archiveWorkList - work list of archives to analyze: this method may add to the work list if it finds nested archives
repositoryClassList - a List to which all classes found in the archive or directory are added, so we later know which files to analyze
Throws:
java.io.IOException
java.lang.InterruptedException

examineClass

private void examineClass(java.lang.String className)
                   throws java.lang.InterruptedException
Examine a single class by invoking all of the Detectors on it.

Parameters:
className - the fully qualified name of the class to examine
Throws:
java.lang.InterruptedException

reportRecoverableException

private void reportRecoverableException(java.lang.String className,
                                        java.lang.Exception e)

reportRecoverableDetectorException

private void reportRecoverableDetectorException(java.lang.String className,
                                                Detector detector,
                                                java.lang.Exception e)

reportFinal

private void reportFinal()
                  throws java.lang.InterruptedException
Call report() on all detectors, to give them a chance to report any accumulated bug reports.

Throws:
java.lang.InterruptedException

getFileExtension

static java.lang.String getFileExtension(java.lang.String fileName)
Get the file extension of given fileName.

Returns:
the file extension, or null if there is no file extension

getURLProtocol

static java.lang.String getURLProtocol(java.lang.String urlString)
Get the URL protocol of given URL string.

Parameters:
urlString - the URL string
Returns:
the protocol name ("http", "file", etc.), or null if there is no protocol

isArchiveExtension

static boolean isArchiveExtension(java.lang.String fileExtension)
Determine if given file extension indicates an archive file.

Parameters:
fileExtension - the file extension (e.g., ".jar")
Returns:
true if the file extension indicates an archive, false otherwise

parseClass

private static org.apache.bcel.classfile.JavaClass parseClass(java.lang.String archiveName,
                                                              java.io.InputStream in,
                                                              java.lang.String fileName)
                                                       throws java.io.IOException
Parse the data for a class to create a JavaClass object.

Throws:
java.io.IOException

parseClass

private static org.apache.bcel.classfile.JavaClass parseClass(java.net.URL url)
                                                       throws java.io.IOException
Parse the data for a class to create a JavaClass object.

Throws:
java.io.IOException

parseFromStream

private static org.apache.bcel.classfile.JavaClass parseFromStream(java.io.InputStream in,
                                                                   java.lang.String fileName)
                                                            throws java.io.IOException
Parse an input stream to produce a JavaClass object. Makes sure that the input stream is closed no matter what.

Throws:
java.io.IOException

handleBugCategories

private static java.util.Set<java.lang.String> handleBugCategories(java.lang.String categories)
Process -bugCategories option.

Parameters:
categories - comma-separated list of bug categories
Returns:
Set of categories to be used

main

public static void main(java.lang.String[] argv)

createEngine

private static FindBugs createEngine(FindBugs.FindBugsCommandLine commandLine,
                                     java.lang.String[] argv)
                              throws java.io.IOException,
                                     FilterException
Throws:
java.io.IOException
FilterException

runMain

private static void runMain(FindBugs findBugs,
                            FindBugs.FindBugsCommandLine commandLine)
                     throws java.io.IOException,
                            java.lang.RuntimeException,
                            FilterException
Throws:
java.io.IOException
java.lang.RuntimeException
FilterException