Package edu.umd.cs.findbugs.ba
Class AnalysisContext
- java.lang.Object
-
- edu.umd.cs.findbugs.ba.AnalysisContext
-
- All Implemented Interfaces:
java.lang.AutoCloseable
@NotThreadSafe public class AnalysisContext extends java.lang.Object implements java.lang.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:
IAnalysisCache
,Global
-
-
Field Summary
Fields Modifier and Type Field Description static boolean
DEBUG
static java.lang.String
DEFAULT_CHECK_FOR_NULL_PARAM_DATABASE_FILENAME
static java.lang.String
DEFAULT_NONNULL_PARAM_DATABASE_FILENAME
static java.lang.String
DEFAULT_NULL_RETURN_VALUE_ANNOTATION_DATABASE
static java.lang.String
DEFAULT_NULL_RETURN_VALUE_DB_FILENAME
static boolean
IGNORE_BUILTIN_MODELS
protected RepositoryLookupFailureCallback
lookupFailureCallback
static java.lang.String
NONNULL_RETURN_DB_FILENAME
static java.lang.String
NONNULL_RETURN_DB_RESOURCE
static java.lang.String
UNCONDITIONAL_DEREF_DB_FILENAME
static java.lang.String
UNCONDITIONAL_DEREF_DB_RESOURCE
-
Constructor Summary
Constructors Constructor Description AnalysisContext(Project project)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addClasspathEntry(java.lang.String url)
Add an entry to the Repository's classpath.void
analysisSkippedDueToInvokeDynamic(XMethod m)
static boolean
analyzingApplicationClass()
void
clearClassBeingAnalyzed()
void
clearClassContextCache()
Clear the ClassContext cache.void
clearRepository()
Clear the BCEL Repository in preparation for analysis.void
close()
static AnalysisContext
currentAnalysisContext()
Get the AnalysisContext associated with this threadstatic XFactory
currentXFactory()
AnnotationRetentionDatabase
getAnnotationRetentionDatabase()
boolean
getBoolProperty(int prop)
Get a boolean property.XMethod
getBridgeFrom(MethodInfo m)
XMethod
getBridgeTo(MethodInfo m)
CheckReturnAnnotationDatabase
getCheckReturnAnnotationDatabase()
ClassDescriptor
getClassBeingAnalyzed()
ClassContext
getClassContext(org.apache.bcel.classfile.JavaClass javaClass)
Get the ClassContext for a class.java.lang.String
getClassContextStats()
Get stats about hit rate for ClassContext cache.int
getClassSize(ClassDescriptor desc)
ClassSummary
getClassSummary()
protected <E> E
getDatabase(java.lang.Class<E> cls)
java.lang.String
getDatabaseInputDir()
Get the interprocedural database input directory.java.lang.String
getDatabaseOutputDir()
Get the interprocedural database output directory.DirectlyRelevantTypeQualifiersDatabase
getDirectlyRelevantTypeQualifiersDatabase()
EqualsKindSummary
getEqualsKindSummary()
FieldStoreTypeDatabase
getFieldStoreTypeDatabase()
Get the property database recording the types of values stored into fields.FieldSummary
getFieldSummary()
InnerClassAccessMap
getInnerClassAccessMap()
JCIPAnnotationDatabase
getJCIPAnnotationDatabase()
RepositoryLookupFailureCallback
getLookupFailureCallback()
Get the lookup failure callback.TypeQualifierNullnessAnnotationDatabase
getNullnessAnnotationDatabase()
ReturnValueNullnessPropertyDatabase
getReturnValueNullnessPropertyDatabase()
Get the property database recording which methods always return nonnull valuesSourceFinder
getSourceFinder()
Get the SourceFinder, for finding source files.SourceInfoMap
getSourceInfoMap()
Get the SourceInfoMap.Subtypes2
getSubtypes2()
Get the Subtypes2 inheritance hierarchy database.SuppressionMatcher
getSuppressionMatcher()
ParameterNullnessPropertyDatabase
getUnconditionalDerefParamDatabase()
Get the property database recording which methods unconditionally dereference parameters.UnreadFields
getUnreadFields()
UnreadFieldsData
getUnreadFieldsData()
java.util.Collection<XClass>
getXClassCollection()
Get Collection of all XClass objects seen so far.void
initDatabases()
Instantiate the CheckReturnAnnotationDatabase.boolean
isApplicationClass(ClassDescriptor desc)
boolean
isApplicationClass(java.lang.String className)
Return whether or not the given class is an application class.boolean
isApplicationClass(org.apache.bcel.classfile.JavaClass cls)
Return whether or not the given class is an application class.boolean
isTooBig(ClassDescriptor desc)
void
loadDefaultInterproceduralDatabases()
If possible, load default (built-in) interprocedural property databases.void
loadInterproceduralDatabases()
If possible, load interprocedural property databases.<DatabaseType extends PropertyDatabase<KeyType,Property>,KeyType extends FieldOrMethodDescriptor,Property>
DatabaseTypeloadPropertyDatabase(DatabaseType database, java.lang.String fileName, java.lang.String description)
Load an interprocedural property database.<DatabaseType extends PropertyDatabase<KeyType,Property>,KeyType extends FieldOrMethodDescriptor,Property>
DatabaseTypeloadPropertyDatabaseFromResource(DatabaseType database, java.lang.String resourceName, java.lang.String description)
Load an interprocedural property database.void
logAnError(java.lang.String msg)
static void
logError(java.lang.String msg)
Report an errorstatic void
logError(java.lang.String msg, java.lang.Exception e)
Report an errororg.apache.bcel.classfile.JavaClass
lookupClass(ClassDescriptor classDescriptor)
Lookup a class.org.apache.bcel.classfile.JavaClass
lookupClass(java.lang.String className)
Lookup a class.java.lang.String
lookupSourceFile(java.lang.String dottedClassName)
Lookup a class's source filestatic org.apache.bcel.classfile.JavaClass
lookupSystemClass(java.lang.String className)
This is equivalent to Repository.lookupClass() or this.lookupClass(), except it uses the original Repository instead of the current one.static void
removeCurrentAnalysisContext()
static void
reportMissingClass(MissingClassException e)
static void
reportMissingClass(ClassDescriptor c)
static void
reportMissingClass(MissingClassException e)
static void
reportMissingClass(java.lang.ClassNotFoundException e)
file a ClassNotFoundException with the lookupFailureCallbackvoid
setAppClassList(java.util.List<ClassDescriptor> appClassCollection)
void
setBoolProperty(int prop, boolean value)
Set a boolean property.void
setBridgeMethod(MethodInfo from, MethodInfo to)
void
setClassBeingAnalyzed(ClassDescriptor classBeingAnalyzed)
void
setClassSummary(ClassSummary classSummary)
static void
setCurrentAnalysisContext(AnalysisContext analysisContext)
Set the current analysis context for this thread.void
setDatabaseInputDir(java.lang.String databaseInputDir)
Set the interprocedural database input directory.void
setDatabaseOutputDir(java.lang.String databaseOutputDir)
Set the interprocedural database output directory.void
setFieldSummary(FieldSummary fieldSummary)
boolean
setMissingClassWarningsSuppressed(boolean value)
void
setUnreadFields(UnreadFields unreadFields)
<DatabaseType extends PropertyDatabase<KeyType,Property>,KeyType extends FieldOrMethodDescriptor,Property>
voidstorePropertyDatabase(DatabaseType database, java.lang.String fileName, java.lang.String description)
Write an interprocedural property database.boolean
unreadFieldsAvailable()
void
updateDatabases(int pass)
After a pass has been completed, allow the analysis context to update information.
-
-
-
Field Detail
-
DEBUG
public static final boolean DEBUG
-
IGNORE_BUILTIN_MODELS
public static final boolean IGNORE_BUILTIN_MODELS
-
DEFAULT_NONNULL_PARAM_DATABASE_FILENAME
public static final java.lang.String DEFAULT_NONNULL_PARAM_DATABASE_FILENAME
- See Also:
- Constant Field Values
-
DEFAULT_CHECK_FOR_NULL_PARAM_DATABASE_FILENAME
public static final java.lang.String DEFAULT_CHECK_FOR_NULL_PARAM_DATABASE_FILENAME
- See Also:
- Constant Field Values
-
DEFAULT_NULL_RETURN_VALUE_ANNOTATION_DATABASE
public static final java.lang.String DEFAULT_NULL_RETURN_VALUE_ANNOTATION_DATABASE
- See Also:
- Constant Field Values
-
UNCONDITIONAL_DEREF_DB_FILENAME
public static final java.lang.String UNCONDITIONAL_DEREF_DB_FILENAME
- See Also:
- Constant Field Values
-
NONNULL_RETURN_DB_FILENAME
public static final java.lang.String NONNULL_RETURN_DB_FILENAME
- See Also:
- Constant Field Values
-
UNCONDITIONAL_DEREF_DB_RESOURCE
public static final java.lang.String UNCONDITIONAL_DEREF_DB_RESOURCE
- See Also:
- Constant Field Values
-
NONNULL_RETURN_DB_RESOURCE
public static final java.lang.String NONNULL_RETURN_DB_RESOURCE
- See Also:
- Constant Field Values
-
DEFAULT_NULL_RETURN_VALUE_DB_FILENAME
public static final java.lang.String DEFAULT_NULL_RETURN_VALUE_DB_FILENAME
- See Also:
- Constant Field Values
-
lookupFailureCallback
protected final RepositoryLookupFailureCallback lookupFailureCallback
-
-
Constructor Detail
-
AnalysisContext
public AnalysisContext(@Nonnull Project project)
-
-
Method Detail
-
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(java.lang.ClassNotFoundException e)
file a ClassNotFoundException with the lookupFailureCallback- See Also:
getLookupFailureCallback()
-
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(java.lang.String msg, java.lang.Exception e)
Report an error
-
logError
public static void logError(java.lang.String msg)
Report an error
-
logAnError
public void logAnError(java.lang.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 java.lang.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 java.lang.ClassNotFoundException
Lookup a class. Use this method instead of Repository.lookupClass().- Parameters:
classDescriptor
- descriptor specifying the class to look up- Returns:
- the class
- Throws:
java.lang.ClassNotFoundException
- if the class can't be found
-
lookupSystemClass
public static org.apache.bcel.classfile.JavaClass lookupSystemClass(@Nonnull java.lang.String className) throws java.lang.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:
java.lang.ClassNotFoundException
-
lookupSourceFile
public final java.lang.String lookupSourceFile(@Nonnull @DottedClassName java.lang.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 setvalue
- 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(java.lang.String databaseInputDir)
Set the interprocedural database input directory.- Parameters:
databaseInputDir
- the interprocedural database input directory
-
getDatabaseInputDir
public final java.lang.String getDatabaseInputDir()
Get the interprocedural database input directory.- Returns:
- the interprocedural database input directory
-
setDatabaseOutputDir
public final void setDatabaseOutputDir(java.lang.String databaseOutputDir)
Set the interprocedural database output directory.- Parameters:
databaseOutputDir
- the interprocedural database output directory
-
getDatabaseOutputDir
public final java.lang.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, java.lang.String fileName, java.lang.String description)
Load an interprocedural property database.- Type Parameters:
DatabaseType
- actual type of the databaseKeyType
- type of key (e.g., method or field)Property
- type of properties stored in the database- Parameters:
database
- the empty database objectfileName
- file to load database fromdescription
- 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, java.lang.String resourceName, java.lang.String description)
Load an interprocedural property database.- Type Parameters:
DatabaseType
- actual type of the databaseKeyType
- type of key (e.g., method or field)Property
- type of properties stored in the database- Parameters:
database
- the empty database objectresourceName
- name of resource to load the database fromdescription
- 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, java.lang.String fileName, java.lang.String description)
Write an interprocedural property database.- Type Parameters:
DatabaseType
- actual type of the databaseKeyType
- type of key (e.g., method or field)Property
- type of properties stored in the database- Parameters:
database
- the databasefileName
- name of database filedescription
- 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 java.util.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(java.lang.String url) throws java.io.IOException
Add an entry to the Repository's classpath.- Parameters:
url
- the classpath entry URL- Throws:
java.io.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 java.lang.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 java.lang.String className) throws java.lang.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:
java.lang.ClassNotFoundException
- (but not really)
-
getInnerClassAccessMap
public InnerClassAccessMap getInnerClassAccessMap()
-
setAppClassList
public void setAppClassList(java.util.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(java.lang.Class<E> cls)
-
close
public void close()
- Specified by:
close
in interfacejava.lang.AutoCloseable
-
-