Common trait that analyses should inherit from that want to use the general analysis framework AnalysisExecutor.
Common trait that analyses should inherit from that want to use the general analysis framework AnalysisExecutor.
An analysis is basically a mapping of a Project's resources to some result.
Each analysis can produce (optionally) some result. E.g., a text describing a scenario that leads to a bug, a graph, a report that identifies a specific line or a combination thereof.
However, an analysis should never rely on the location of a resource. If an analysis
needs access to further resources, it should use the Project class.
Aggregates several analyses such that they are treated as one afterwards.
Aggregates several analyses such that they are treated as one afterwards.
This class is thread safe.
If you extend this class, make sure that all access to this classes (mutable) fields/
mutable data structures is synchronized on this.
Exception raised while the analysis is executed.
Provides the necessary infrastructure to easily execute a given analysis that generates some analysis result that can be printed on the command line.
Provides the necessary infrastructure to easily execute a given analysis that generates some analysis result that can be printed on the command line.
To facilitate the usage of this trait several implicit conversions are defined that wrap standard analyses (org.opalj.br.analyses) such that they report results that are reportable.
This class distinguishes between class files belonging to the code base under
analysis and those that belong to the libraries. Those belonging to the libraries
are loaded using the ClassFileReader for library classes (basically, all method
bodies are skipped org.opalj.br.reader.Java8LibraryFramework).
The parameter to specify library classes is -libcp=, the parameter to specify
the "normal" classpath is -cp=.
Result of some analysis that just consists of some text.
Result of some analysis that just consists of some text.
A string printed to the console.
Default implementation of the AnalysisExecutor which facilitates the development of analyses which are executed in one step.
Stores the information where each field is read and written.
Stores the information where each field is read and written. If the project is incomplete the results are also necessary incomplete.
Thrown when the framework determines that the project is not consistent.
Stores the information which types of objects are (potentially) injected based on the annotations that are found in the project.
Stores the information which types of objects are (potentially) injected based on the annotations that are found in the project. For example, by means of reflection or by a web server or some other comparable framework.
This information is used to compute the entry points of JEE applications.
Stores the information about those classes that are not instantiable.
Stores the information about those classes that are not instantiable. The set of classes that are not instantiable is usually only a small fraction of all classes and hence, more efficient to store/access).
Encapsulates the information about non-abstract, non-private, non-static
methods which are 'not initializers (<(cl)init>) and which is required when determining
potential call targets.
Encapsulates the information about non-abstract, non-private, non-static
methods which are 'not initializers (<(cl)init>) and which is required when determining
potential call targets.
Equality is defined based on the name, descriptor and declaring package of a method (the concrete declaring class is not considered!).
,A class may have -- w.r.t. a given package name -- at most one package visible method which has a specific name and descriptor combination. For methods with protected or public visibility a class always has at most one method with a given name and descriptor.
An analysis that may produce multiple results.
An analysis that may produce multiple results. E.g., an analysis that looks for instances of bug patterns.
An analysis that performs all computations in one step.
An analysis that performs all computations in one step. Only very short-running analyses should use this interface as reporting progress is not supported.
Enables the management of the progress of a long running computation.
Enables the management of the progress of a long running computation. Typically a long running progress such as an analysis is expected to report progress every 250 to 2000 milliseconds. It should -- however -- check every ~100 milliseconds the interrupted status to enable a timely termination.
This trait defines a call-back interface that is implemented by some class that runs an analysis and which passes an instance of it to some analysis to report progress.
Implementations must handle the case where a step that was started later finishes earlier than a previous step. In other words, even if the last step has ended, that does not mean that the analysis as a whole has already finished. Instead an implementation has to track how many steps have ended to determine when the whole analysis has ended.
,Implementations of this class must be thread safe if the analysis is multi- threaded.
Primary abstraction of a Java project; i.e., a set of classes that constitute a library, framework or application as well as the libraries or frameworks used by the former.
Primary abstraction of a Java project; i.e., a set of classes that constitute a library, framework or application as well as the libraries or frameworks used by the former.
This class has several purposes:
ClassFiles.SourceElementsPropertyStoreKey which gives access to the property store.This class is thread-safe.
Projects can easily be created and queried using the Scala REPL. For example,
to create a project, you can use:
val JRE = "/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib" val project = org.opalj.br.analyses.Project(new java.io.File(JRE))
Now, to determine the number of methods that have at least one parameter of type
int, you can use:
project.methods.filter(_.parameterTypes.exists(_.isIntegerType)).size
The type of the source of the class file. E.g., a URL, a File,
a String or a Pair (JarFile,JarEntry). This information is needed for, e.g.,
presenting users meaningful messages w.r.t. the location of issues.
We abstract over the type of the resource to facilitate the embedding in existing
tools such as IDEs. E.g., in Eclipse IResource's are used to identify the
location of a resource (e.g., a source or class file.)
An index that enables the efficient lookup of source elements (methods and fields) given the method's/field's name and the descriptor/field type.
An index that enables the efficient lookup of source elements (methods and fields)
given the method's/field's name and the descriptor/field type. The index contains fields
with public, protected, <default> and private visibility.
Basically an index of the source elements (methods and fields) of a project.
This index can be used, e.g., to resolve method calls based on the method's names and/or descriptors.
To get an instance of a project index call Project.get and pass in the ProjectIndexKey object.
FieldAccessInformation to get the information where a field is accessed.
ProjecInformationKey objects are used to get/associate some
(immutable) information with a project that should be computed on demand.
ProjecInformationKey objects are used to get/associate some
(immutable) information with a project that should be computed on demand.
For example, imagine that you write an analysis that requires – as a foundation –
the project's call graph. In this case, to get the call graph it is sufficient
to pass the respective key to the Project object. If the call graph was already
computed that one will be returned, otherwise the computation will be performed and
the result will be cached for future usage before it is returned.
If access to some project information is required it is sufficient to use
the (singleton) instance of the respective ProjectInformationKey to get
the respective project information.
For example, let's assume that an index of all fields and methods is needed. In this case the code to get the index would be:
import ...{ProjectIndex,ProjectIndexKey} val project : Project = ??? val projectIndex = project.get(ProjectIndexKey) // do something with the index
ProjectInformationKey Making project wide information available on demand is done as follows.
ProjectInformationKey class that inherits from this trait and
which calls the base analysis. It is recommended that the factory method (compute)
is side-effect free.Project takes care of threading related issues. The methods requirements
and compute will never be called concurrently w.r.t. the same project object.
However, concurrent calls may happen w.r.t. two different project objects.
Project takes care of the caching of the result of the computation of the information.
Enables project wide lookups of methods and fields as required to determine the target(s) of an invoke or field access instruction.
Enables project wide lookups of methods and fields as required to determine the target(s) of an invoke or field access instruction.
The current implementation is based on the correct project assumption;
i.e., if the bytecode as a whole is not valid, the result is generally
undefined.
One example would be, if we have two interfaces which define a non-abstract
method with the same signature and both interfaces are implemented by a third
interface which does not override these methods. In this case the result of a
resolveMethodReference is not defined, because the code base as a whole is
not valid.
The type of the underlying source file.
org.opalj.br.analyses for several predefined converter functions.
Result of analyses that can be meaningfully represented using text.
An analysis that may produce a result.
Type alias for Project's with an arbitrary sources.
Factory to create Config objects with a given analysis mode.
Factory to create Config objects with a given analysis mode.
This is particularly useful for testing purposes as it facilitates Config file independent
tests.
Defines factory methods for BasicReports.
This analysis determines where each field is accessed.
This analysis determines where each field is accessed.
Use the FieldAccessInformationKey to query a project about the field access information.
val accessInformation = project.get(FieldAccessInformationKey)The analysis is internally parallelized and should not be run with other analyses in parallel.
,The analysis does not take reflective field accesses into account.
The key object to get global field access information.
The key object to get global field access information.
To get the index use the Project's get method and pass in this object.
Factory to create InjectedClassesInformation.
The key object to get information about the types of objects that are potentially injected.
The key object to get information about the types of objects that are potentially injected. For example, by a web framework or a dependency injection framework.
To get the index use the Project's get method and pass in this object.
A very basic analysis which identifies those classes that can never be instantiated (e.g.,
java.lang.Math) by user code.
A very basic analysis which identifies those classes that can never be instantiated (e.g.,
java.lang.Math) by user code.
A class is not instantiable if it only defines private constructors and these constructors are not called by any static method and the class is also not Serializable. However, if the static initializer creates an instance of the respective class then it is possible that this a class is rated as not client instantiable though it is possible that an instance exists and may even be used.
A more precise analysis is available that uses the fixpoint computations framework.
,The analysis does not take reflective instantiations into account!
,If this class is queried (after performing the analysis) about a class that was not analyzed, the result will be that the class is considered to be instantiable. This information is relevant in various contexts, e.g., to determine a precise call graph. For example, instance methods of those objects that cannot be created are always dead. However, this analysis only provides the information whether the class is instantiable by client code!
Use the InstantiableClassesKey to query a project about the instantiable classes.
val instantiableClasses = project.get(InstantiableClassesKey), This analysis does not consider protected and/or package visible constructors as it assumes that classes may be added to the respective package later on (open-packages assumption.)
The key object to get information about the classes that can be instantiated (either, directly or indirectly).
The key object to get information about the classes that can be instantiated (either, directly or indirectly).
To get the index use the Project's get method and pass in this object.
This project information key offers the possibility to gather simple counting statistics.
Definition of factory and extractor methods for MethodDeclarationContext objects.
Characterizes the type of an event related to a running analysis.
Characterizes the type of an event related to a running analysis.
ProgressManagement for further details.
Factory for a function to create a default progress management object that basically does not track the progress.
Definition of factory methods to create Projects.
Factory for ProjectIndex objects.
The key object to get an index of the source elements of a project.
The key object to get an index of the source elements of a project.
To get the index use the Project's get method and pass in
this object.
The key object to get the project's org.opalj.fpcf.PropertyStore.
The key object to get the project's org.opalj.fpcf.PropertyStore.
It is possible to set the project's debug flag using the project's
org.opalj.br.analyses.SourceElementsPropertyStore.debug config key.
The key object to get information about all string constants found in the project's code.
The key object to get information about all string constants found in the project's code.
To get the index use the Project's get method and pass in this object.
Defines commonly useful type aliases.