Class 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 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
    • 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()
      • setClassBeingAnalyzed

        public void setClassBeingAnalyzed​(@Nonnull
                                          ClassDescriptor classBeingAnalyzed)
      • clearClassBeingAnalyzed

        public void clearClassBeingAnalyzed()
      • setClassSummary

        public void setClassSummary​(@Nonnull
                                    ClassSummary classSummary)
      • setFieldSummary

        public void setFieldSummary​(@Nonnull
                                    FieldSummary fieldSummary)
      • 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()
      • analyzingApplicationClass

        public static boolean analyzingApplicationClass()
      • 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)
      • 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 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​(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 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,
                                                                                                                                                                                          java.lang.String resourceName,
                                                                                                                                                                                          java.lang.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,
                                                                                                                                                                       java.lang.String fileName,
                                                                                                                                                                       java.lang.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 java.util.Collection<XClass> getXClassCollection()
        Get Collection of all XClass objects seen so far.
        Returns:
        Collection of all XClass objects seen so far
      • 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.
      • 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
      • 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)
      • 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.
      • getDatabase

        protected <E> E getDatabase​(java.lang.Class<E> cls)
      • close

        public void close()
        Specified by:
        close in interface java.lang.AutoCloseable