Class AnalysisContext

java.lang.Object
edu.umd.cs.findbugs.ba.AnalysisContext
All Implemented Interfaces:
AutoCloseable

@NotThreadSafe public class AnalysisContext extends Object implements AutoCloseable
A context for analysis of a complete project. This serves as the repository for whole-program information and data structures.

NOTE: this class is slated to become obsolete. New code should use the IAnalysisCache object returned by Global.getAnalysisCache() to access all analysis information (global databases, class and method analyses, etc.)

Author:
David Hovemeyer
See Also:
  • Field Details

    • DEBUG

      public static final boolean DEBUG
    • IGNORE_BUILTIN_MODELS

      public static final boolean IGNORE_BUILTIN_MODELS
    • DEFAULT_NONNULL_PARAM_DATABASE_FILENAME

      public static final String DEFAULT_NONNULL_PARAM_DATABASE_FILENAME
      See Also:
    • DEFAULT_CHECK_FOR_NULL_PARAM_DATABASE_FILENAME

      public static final String DEFAULT_CHECK_FOR_NULL_PARAM_DATABASE_FILENAME
      See Also:
    • DEFAULT_NULL_RETURN_VALUE_ANNOTATION_DATABASE

      public static final String DEFAULT_NULL_RETURN_VALUE_ANNOTATION_DATABASE
      See Also:
    • UNCONDITIONAL_DEREF_DB_FILENAME

      public static final String UNCONDITIONAL_DEREF_DB_FILENAME
      See Also:
    • NONNULL_RETURN_DB_FILENAME

      public static final String NONNULL_RETURN_DB_FILENAME
      See Also:
    • UNCONDITIONAL_DEREF_DB_RESOURCE

      public static final String UNCONDITIONAL_DEREF_DB_RESOURCE
      See Also:
    • NONNULL_RETURN_DB_RESOURCE

      public static final String NONNULL_RETURN_DB_RESOURCE
      See Also:
    • DEFAULT_NULL_RETURN_VALUE_DB_FILENAME

      public static final String DEFAULT_NULL_RETURN_VALUE_DB_FILENAME
      See Also:
    • lookupFailureCallback

      protected final RepositoryLookupFailureCallback lookupFailureCallback
  • Constructor Details

    • AnalysisContext

      public AnalysisContext(@Nonnull Project project)
  • Method Details

    • currentAnalysisContext

      public static AnalysisContext currentAnalysisContext()
      Get the AnalysisContext associated with this thread
    • currentXFactory

      public static XFactory currentXFactory()
    • getClassBeingAnalyzed

      public ClassDescriptor getClassBeingAnalyzed()
    • setClassBeingAnalyzed

      public void setClassBeingAnalyzed(@Nonnull ClassDescriptor classBeingAnalyzed)
    • clearClassBeingAnalyzed

      public void clearClassBeingAnalyzed()
    • getClassSummary

      public ClassSummary getClassSummary()
    • setClassSummary

      public void setClassSummary(@Nonnull ClassSummary classSummary)
    • getEqualsKindSummary

      public EqualsKindSummary getEqualsKindSummary()
    • getFieldSummary

      public FieldSummary getFieldSummary()
    • setFieldSummary

      public void setFieldSummary(@Nonnull FieldSummary fieldSummary)
    • getUnreadFieldsData

      @Nonnull public UnreadFieldsData getUnreadFieldsData()
    • getUnreadFields

      @Nonnull public UnreadFields getUnreadFields()
    • unreadFieldsAvailable

      public boolean unreadFieldsAvailable()
    • setUnreadFields

      public void setUnreadFields(@Nonnull UnreadFields unreadFields)
    • reportMissingClass

      public static void reportMissingClass(ClassNotFoundException e)
      file a ClassNotFoundException with the lookupFailureCallback
      See Also:
    • reportMissingClass

      public static void reportMissingClass(MissingClassException e)
    • analyzingApplicationClass

      public static boolean analyzingApplicationClass()
    • reportMissingClass

      public static void reportMissingClass(MissingClassException e)
    • reportMissingClass

      public static void reportMissingClass(ClassDescriptor c)
    • logError

      public static void logError(String msg, Exception e)
      Report an error
    • logError

      public static void logError(String msg)
      Report an error
    • logAnError

      public void logAnError(String msg)
    • analysisSkippedDueToInvokeDynamic

      public void analysisSkippedDueToInvokeDynamic(XMethod m)
    • setMissingClassWarningsSuppressed

      public boolean setMissingClassWarningsSuppressed(boolean value)
    • isApplicationClass

      public boolean isApplicationClass(org.apache.bcel.classfile.JavaClass cls)
      Return whether or not the given class is an application class.
      Parameters:
      cls - the class to lookup
      Returns:
      true if the class is an application class, false if not an application class or if the class cannot be located
    • isApplicationClass

      public boolean isApplicationClass(@DottedClassName String className)
      Return whether or not the given class is an application class.
      Parameters:
      className - name of a class
      Returns:
      true if the class is an application class, false if not an application class or if the class cannot be located
    • isApplicationClass

      public boolean isApplicationClass(ClassDescriptor desc)
    • getClassSize

      public int getClassSize(ClassDescriptor desc)
    • isTooBig

      public boolean isTooBig(ClassDescriptor desc)
    • lookupClass

      public org.apache.bcel.classfile.JavaClass lookupClass(@Nonnull ClassDescriptor classDescriptor) throws ClassNotFoundException
      Lookup a class. Use this method instead of Repository.lookupClass().
      Parameters:
      classDescriptor - descriptor specifying the class to look up
      Returns:
      the class
      Throws:
      ClassNotFoundException - if the class can't be found
    • lookupSystemClass

      public static org.apache.bcel.classfile.JavaClass lookupSystemClass(@Nonnull String className) throws ClassNotFoundException
      This is equivalent to Repository.lookupClass() or this.lookupClass(), except it uses the original Repository instead of the current one. This can be important because URLClassPathRepository objects are closed after an analysis, so JavaClass objects obtained from them are no good on subsequent runs.
      Parameters:
      className - the name of the class
      Returns:
      the JavaClass representing the class
      Throws:
      ClassNotFoundException
    • lookupSourceFile

      public final String lookupSourceFile(@Nonnull @DottedClassName String dottedClassName)
      Lookup a class's source file
      Parameters:
      dottedClassName - the name of the class
      Returns:
      the source file for the class, or SourceLineAnnotation.UNKNOWN_SOURCE_FILE if unable to determine
    • loadInterproceduralDatabases

      public final void loadInterproceduralDatabases()
      If possible, load interprocedural property databases.
    • loadDefaultInterproceduralDatabases

      public final void loadDefaultInterproceduralDatabases()
      If possible, load default (built-in) interprocedural property databases. These are the databases for things like Java core APIs that unconditional dereference parameters.
    • setBoolProperty

      public final void setBoolProperty(@AnalysisFeature int prop, boolean value)
      Set a boolean property.
      Parameters:
      prop - the property to set
      value - the value of the property
    • getBoolProperty

      public final boolean getBoolProperty(@AnalysisFeature int prop)
      Get a boolean property.
      Parameters:
      prop - the property
      Returns:
      value of the property; defaults to false if the property has not had a value assigned explicitly
    • setDatabaseInputDir

      public final void setDatabaseInputDir(String databaseInputDir)
      Set the interprocedural database input directory.
      Parameters:
      databaseInputDir - the interprocedural database input directory
    • getDatabaseInputDir

      public final String getDatabaseInputDir()
      Get the interprocedural database input directory.
      Returns:
      the interprocedural database input directory
    • setDatabaseOutputDir

      public final void setDatabaseOutputDir(String databaseOutputDir)
      Set the interprocedural database output directory.
      Parameters:
      databaseOutputDir - the interprocedural database output directory
    • getDatabaseOutputDir

      public final String getDatabaseOutputDir()
      Get the interprocedural database output directory.
      Returns:
      the interprocedural database output directory
    • loadPropertyDatabase

      public <DatabaseType extends PropertyDatabase<KeyType, Property>, KeyType extends FieldOrMethodDescriptor, Property> DatabaseType loadPropertyDatabase(DatabaseType database, String fileName, String description)
      Load an interprocedural property database.
      Type Parameters:
      DatabaseType - actual type of the database
      KeyType - type of key (e.g., method or field)
      Property - type of properties stored in the database
      Parameters:
      database - the empty database object
      fileName - file to load database from
      description - description of the database (for diagnostics)
      Returns:
      the database object, or null if the database couldn't be loaded
    • loadPropertyDatabaseFromResource

      public <DatabaseType extends PropertyDatabase<KeyType, Property>, KeyType extends FieldOrMethodDescriptor, Property> DatabaseType loadPropertyDatabaseFromResource(DatabaseType database, String resourceName, String description)
      Load an interprocedural property database.
      Type Parameters:
      DatabaseType - actual type of the database
      KeyType - type of key (e.g., method or field)
      Property - type of properties stored in the database
      Parameters:
      database - the empty database object
      resourceName - name of resource to load the database from
      description - description of the database (for diagnostics)
      Returns:
      the database object, or null if the database couldn't be loaded
    • storePropertyDatabase

      public <DatabaseType extends PropertyDatabase<KeyType, Property>, KeyType extends FieldOrMethodDescriptor, Property> void storePropertyDatabase(DatabaseType database, String fileName, String description)
      Write an interprocedural property database.
      Type Parameters:
      DatabaseType - actual type of the database
      KeyType - type of key (e.g., method or field)
      Property - type of properties stored in the database
      Parameters:
      database - the database
      fileName - name of database file
      description - description of the database
    • setCurrentAnalysisContext

      public static void setCurrentAnalysisContext(AnalysisContext analysisContext)
      Set the current analysis context for this thread.
      Parameters:
      analysisContext - the current analysis context for this thread
    • removeCurrentAnalysisContext

      public static void removeCurrentAnalysisContext()
    • getXClassCollection

      public Collection<XClass> getXClassCollection()
      Get Collection of all XClass objects seen so far.
      Returns:
      Collection of all XClass objects seen so far
    • getSuppressionMatcher

      public SuppressionMatcher getSuppressionMatcher()
    • addClasspathEntry

      public void addClasspathEntry(String url) throws IOException
      Add an entry to the Repository's classpath.
      Parameters:
      url - the classpath entry URL
      Throws:
      IOException
    • clearClassContextCache

      public void clearClassContextCache()
      Clear the ClassContext cache. This should be done between analysis passes.
    • clearRepository

      public void clearRepository()
      Clear the BCEL Repository in preparation for analysis.
    • getAnnotationRetentionDatabase

      public AnnotationRetentionDatabase getAnnotationRetentionDatabase()
    • getCheckReturnAnnotationDatabase

      public CheckReturnAnnotationDatabase getCheckReturnAnnotationDatabase()
    • getClassContext

      public ClassContext getClassContext(org.apache.bcel.classfile.JavaClass javaClass)
      Get the ClassContext for a class.
      Parameters:
      javaClass - the class
      Returns:
      the ClassContext for that class
    • getClassContextStats

      public String getClassContextStats()
      Get stats about hit rate for ClassContext cache.
      Returns:
      stats about hit rate for ClassContext cache
    • getFieldStoreTypeDatabase

      public FieldStoreTypeDatabase getFieldStoreTypeDatabase()
      Get the property database recording the types of values stored into fields.
      Returns:
      the database, or null if there is no database available
    • getJCIPAnnotationDatabase

      public JCIPAnnotationDatabase getJCIPAnnotationDatabase()
    • getLookupFailureCallback

      public RepositoryLookupFailureCallback getLookupFailureCallback()
      Get the lookup failure callback.
    • getSourceFinder

      public SourceFinder getSourceFinder()
      Get the SourceFinder, for finding source files.
    • getSourceInfoMap

      public SourceInfoMap getSourceInfoMap()
      Get the SourceInfoMap.
    • getUnconditionalDerefParamDatabase

      public ParameterNullnessPropertyDatabase getUnconditionalDerefParamDatabase()
      Get the property database recording which methods unconditionally dereference parameters.
      Returns:
      the database, or null if there is no database available
    • initDatabases

      public void initDatabases()
      Instantiate the CheckReturnAnnotationDatabase. Do this after the repository has been set up.
    • lookupClass

      public org.apache.bcel.classfile.JavaClass lookupClass(@Nonnull @DottedClassName String className) throws ClassNotFoundException
      Lookup a class. Use this method instead of Repository.lookupClass().
      Parameters:
      className - the name of the class
      Returns:
      the JavaClass representing the class
      Throws:
      ClassNotFoundException - (but not really)
    • getInnerClassAccessMap

      public InnerClassAccessMap getInnerClassAccessMap()
    • setAppClassList

      public void setAppClassList(List<ClassDescriptor> appClassCollection)
    • updateDatabases

      public void updateDatabases(int pass)
      After a pass has been completed, allow the analysis context to update information.
      Parameters:
      pass - -- the first pass is pass 0
    • getReturnValueNullnessPropertyDatabase

      public ReturnValueNullnessPropertyDatabase getReturnValueNullnessPropertyDatabase()
      Get the property database recording which methods always return nonnull values
      Returns:
      the database, or null if there is no database available
    • getSubtypes2

      public Subtypes2 getSubtypes2()
      Get the Subtypes2 inheritance hierarchy database.
    • getDirectlyRelevantTypeQualifiersDatabase

      public DirectlyRelevantTypeQualifiersDatabase getDirectlyRelevantTypeQualifiersDatabase()
    • getBridgeTo

      @CheckForNull public XMethod getBridgeTo(MethodInfo m)
    • getBridgeFrom

      @CheckForNull public XMethod getBridgeFrom(MethodInfo m)
    • setBridgeMethod

      public void setBridgeMethod(MethodInfo from, MethodInfo to)
    • getNullnessAnnotationDatabase

      public TypeQualifierNullnessAnnotationDatabase getNullnessAnnotationDatabase()
    • getDatabase

      protected <E> E getDatabase(Class<E> cls)
    • close

      public void close()
      Specified by:
      close in interface AutoCloseable