- we are now using sbt 1.6.2
- we are now using Scala 2.13
- Scala 2.13 changes:
- replace Unicode arrows (⇒,→,←) by ASCII arrows (=>,->,<-)
- replace Traversable by scala.collection.Iterable
- replace TraversableOnce by scala.collection.IterableOnce
- changes to OPAL's custom data structures:
- replace RefIterator by scala.collection.iterator
- replace Chain by scala.collection.immutable.List
- replace RefArray and IntArray by scala.collection.immutable.ArraySeq
- replace RefArrayStack by scala.collection.immutable.Stack
- replace RefAppendChain by scala.collection.mutable.ArrayDeque
- replace RefArrayBuffer by scala.collection.mutable.ArrayBuffer
- Scala 2.13 changes:
- full support for Java 17 up to 19
- support for Java 17 Sealed Classes
- added isStrict attribute to classes
- ignore isStrict attribute on classes and methods for Java >= 17
- completed framework for call graph analyses
- introduced TypeIterator to uniformly access type information
- using contexts instead of methods to enable context-sensitive analysis (0-1-CFA, 1-1-CFA)
- support library analysis with CFA
- introduced new immutability analyses
- replaced FieldMutabilityAnalysis with FieldAssignabilityAnalysis
- support for thread-safe and unsafe lazy initialization
- support for clone pattern
- introduced new FieldImmutabilityAnalysis to integrate field assignability with mutability of values
- support for transitive and non-transitive immutability
- support for immutability dependent on generic type parameters
- updated ClassImmutabilityAnalysis and TypeImmutabilityAnalysis to use new FieldImmutability properties
- replaced FieldMutabilityAnalysis with FieldAssignabilityAnalysis
- added EntrypointsFinder for Android apps
- allow flushing caches for ObjectTypes/ArrayTypes to free memory when creating many projects in a row
- we are now using Scala 2.12.13
cleanBuild
now requires at least Java 14 to compile all test fixtures- full support for Java 11 up to 16
- class files for newer Java versions can be read if they do not use features beyond Java 16
- opportunistic rewriting of dynamic constants
- parallel implementation for the PropertyStore
- FPCF analyses now use sets for their dependencies
- added preliminary framework for FPCF call graphs
- includes CHA, RTA, XTA/MTA/FTA/CTA and points-to based call graphs
- also includes modules for reflection, static initializers, finalizers, serialization, threads, selected native methods and to load dynamic data on reflective calls recorded by TamiFlex
- allows resolution of calls by method signature for library analyses
- added an analysis to collect information about the usage of a class within a project
- added
LongTrieSet
,LongLinkedTrieSet
andLongTrieSetWithList
to optimize storage of Long values - removed
PrecomputedPartialResult
- fixed the semantics of virtual and interface calls w.r.t. private methods
- fixed TAC text representation where a regular return would be marked with a warning that it always throws an exception even if it doesn't
- fixed a wrong mapping of TAC indices on some dead bytecode instructions
- fixed escape analysis which could produce non-deterministic results
- fixed issues with the purity analyses
- fixed parsing of -projectConfig parameter for
AnalysisApplication
- fixed equals implementation for
EOptionP
- added a preliminary IFDS framework
- the Hermes and BugPicker UI projects were deleted (JavaFX was removed from the JDK 11 which makes the overall development and deplyoment process to cost intensive)
- Hermes was promoted to a real project: TOOLS/hermes
- renamed
DefaultOneStepAnalysis
toProjectAnalysisApplication
; added a new subclassMethodAnalysisApplication
to facilitate the developmen of respective analysis - added support for analyses using the monotone framework; the monotone framework itself was added to
CFG
- the three-address code has been moved to its own subproject (
ThreeAddressCode
) in the folder OPAL/tac - fixed the name of the static analysis infrastructure project (the name of the project on Maven Central has changed)
- vastly improved PropertyStore with support for Transformers
- the demos subproject was moved to the OPAL-DeveloperTools subfolder
- fixed the computation of
allSubtypes
of forjava.lang.Object
- fixed several issues related to the handling of methods with subroutines (JSR/RET)
- fixed the toString method of
StaticMethodCall
- fixed the generation of ObjectTypes using
Type(classOf[...])
- added a preliminary FPCF analysis which determines the type of values stored in fields
- added a preliminary FPCF analysis which determines core properties of the values returned by methods
- the FPCF framework now has proper support for analyses which refine lower bounds
- renamed
DomainValue.valueType
toleastUpperType
- renamed
DefaultDomainValueBinding
toDefaultSpecialDomainValuesBinding
- removed
...ai...TheClassHierarchy
trait - every domain has to provide a class hierarchy ValueInformation
now provides a more elaborate interface and should be usable whereverKnownTypedValue
was used before- moved the
isValueASubtypeOf
methods to the value framework (org.opalj.value
) (i.e., the methods are moved up in the class hierarchy) - moved the
verificationTypeInfo
methods to the value framework (i.e., they are moved up in the class hierarchy) - the domain classes (e.g.,
org.opalj.ai.domain.l0.TypeLevelReferenceValue
or...l1.ReferenceValues
) which define the framework for handling reference values now use traits instead of classes; the concrete classes are now found in the...DefaultBinding...
classes java.*.Comparable|Cloneable|Serializable
now get fixed ObjectType ids- Java 11 files which do not use Java 11 Bytecode features can be read (Java doesn't make use of the new features so far)
- we now have a new meta-project
Framework
to facilitate reuse.
- fixed a bug in the identification of closed strongly connected components
- fixed a bug when computing the stackmap table when a register store instruction is found in a try block of a finally handler and therefore is considered to be throwing an exception by the VM when it tries to verify the bytecode
- fixed a bug when a simple property of an entity is queried in a later phase (after the analysis was run) and the analysis didn't compute a value
- Added support for instrumenting class files
- support for Java 9
- support for Java 10
- support for Java 11
- rewriting StringConcatFactory based invokedynamics
- support for analyzing Scala 2.12.6-7 invokedynamics
- Hermes now has extended visualization capabilities to make it even easiere to comprehend the differences between projects
- the overall performance has been improved (in particular on multi-core systems with 4 or more cores)
- moved to sbt 1.2.x
- fixed issues in some tests which open a huge number of files
- fixed a rare issue in the identification of closed strongly connected components
- completely reimplemented the property store
- added various analyses related to deriving the purity of methods, the immutabiliy of classes, escape information etc.
- very much improved OPAL's collection library w.r.t. optimized data structures for Int values
- we are now using Scala 2.12.4
- added a method to reset a Project to its initial state (all information derived by analyses is thrown away)
- added several type test/cast methods to Instruction to support cases where the type of an instruction is known from the context
- added a new framework for testing properties derived using the
PropertiesStore
- improved the time required to create a project by ~20-30%
- improved handling of exceptions in TACAI
- improved the framework for computing control-dependency information
- improved the precision and soundness of the FieldMutabilityAnalysis
- fixed an off-by-one-error in computeMaxLocals
- fixed the recording of def-use information when the execution of a regular instruction (not
athrow
) always results in an exception (This also affected the generation of the 3-address code; in the 3-address code this resulted in local variable usage which had no definition site.) - fixed the handling of exceptions by the data-flow framework if the exceptions hierarchy is not completely known
- fixed an issue related to cyclic jumps; i.e. goto instructions which form a loop (notably x: goto x;)
- fixed an infinite loop if a class file contains a "too small" unknown attribute and the reader (infinitely) waits for the next byte(s)
- updated dependencies
- removed support for setting the "isStrict" mode from AI (nowadays all VMs etc. perform all computations with asStrict semantics; we are now assuming everything is strict)
- the call graph construction algorithms finally completely support Java 8 (e.g., default methods, static methods in interfaces, lambda expressions)
- Assertions are turned-off by default when you checkout the latest stable release of OPAL; to turn them on rename
local.sbt.template
tolocal.sbt
; assertions are still turned on, when you depend on a development snapshot from Maven Central - removed the Eclipse plug-in sub-project; it wasn't maintained anymore and is now replaced by the ATOM plug-in
- removed the Viz sub-project; it wasn't maintained anymore and OPAL has gained the possibility to generate SVGs using a JavaScript based Graphviz version which is executed using JDK's Nashorn JavaScript engine
- fixed several minor bugs and issues when analyzing bytecode which contains compile-time dead code; the Groovy compiler frequently generated (generates?) such code
- renamed packages called "analysis" to "analyses"
Method
andField
now have a back-link to their respective defining class files. The previous mechanisms provided by theProject
are no longer available.- added explicit support for new code entities to better support Escape/Points-to analyses:
(Object/Array)AllocationSite
andFormalParameter
ProjectInformationKey
s can now be initialized using project specific initialization information (SeeProject.getOrCreateProjektInformationKeyInitializationData
for further information.)- renamed
ObjectImmutabilityAnalysi
toClassImmutabilityAnalysis
to reflect the names used in the forthcoming paper - removed the legacy method call resolution methods (those only working with pre Java 8 code) from the
Project
- we are now simplifying the control-flow at load-time to ensure that the overall control-flow is more regular; i.e., that if instructions related to loops directly jump back and do not jump forward to a goto instruction which then jumps back
- fixed a bug when INVOKEDYNAMIC instructions are rewritten
- significantly overhauled the HTML structure generated by the OPAL Disassembler; take a look at our new ATOM Bytecode Disassembler plug-in!
- significantly improved the output generated by the
TAC
tool; the CFG is also included - Removed
FailingExpr
- to check if an expression has failed use the CFG (this was previously necessary anyway to check if a statement resulted in an exception; i.e., handling of exceptions is now more consistent.) - renamed JumpToSubroutine in the 3-address code to JSR
- the parameters are now explicitly represented in TACAI
- fixed a bug in TACAI where the handled exceptions are swallowed
- fixed issues related to the computation of def-use information for very old (JSR/RET) bytecode
Stmt
andExpr
can now be cast using the "as..." methods, if the target type is known (this provides an alternative if a pattern match is only done w.r.t. a (small) subset of the declared fields.)
- Hermes now has a headless mode (HermesCLI) (It is not yet possible to run the optimizer, but everything else works.)
- renamed the methods of the
PropertyStore
which used operators (e.g., '<<', '<|<', ... ) to facilitate comprehension - clients can now control whether cycle-resolution should be performed or not
- IntSet is now called IntArraySet
- OPAL now has a very advanced 3-address code representation; go to www.opal-project.de to read about the 3-address code
- fixed all known bugs when rewriting INVOKEDYNAMIC instruction (contributed by Andreas Muttscheller)
- improved the public API of the
Abstract Interpretation Framework
to facilitate analyses using the 3-address representation - the build script is now free of deprecation warnings (contributed by Simon Leischnig)
- added support for writing out (large) graphs as a CSV encoded adjacency matrix
- the
PropertyStoreKey
(previouslySourceElementsPropertyStoreKey
) offers the functionality to add functions which compute new entities
- we now have complete support for converting a class file using the standard bytecode representation to the native representation; the latter can then be serialized to a valid class file
- fixed a very, very rare concurrency related issue that resulted in OPAL making no progress at all due to insufficient resources (out of threads)
- fixed a null pointer exception in case of "uninitialized"
...ai.StringValues
- we have created a new webpage along with this release which has more documentation on how to use specific parts of OPAL
- we are now using Scala 2.11.11 (this is probably the last release using Scala 2.11)
- fixed the creation of the XHTML view (Bytecode Disassembler) for several Java 8 features
- the AI now prevents simple, unnecessary joins if a variable is known to be dead when multiple control flow paths join
- added a simple live variables analysis to
br.Code.liveVariables
which computes liveness information for a code's locals (operand stack values are not considered because standard compilers generally don't create "dead operands" and the intended usage are performance and precision improvements) - refined the implementations of Graphs
- added efficient implementatin of Tarjan's algorithm for finding strongly connected components (the implementation can easily handle graphs with millions of nodes)
- added support for converting dot files to SVG using vis-js.com
- completely reworked
org.opalj.collection.immmutable.UIDSet
; instead of a simple binary search tree - which had significant scalability issues - we are now using a trie. - initial release of Hermes
- removed the support for
SetProperties
from thePropertyStore
due to conceptual mismatch - we are now using sbt 0.13.15
- fixed ClassHierarchy.rootInterfaceTypes
- fixed Tasks.submit if all previously submitted tasks were already finished
- fixed ClassFile.isEffectiveFinal for interface types
- fixed the ids generated for CFGs
- added support for the JSON Serialization of Milliseconds, Nanoseconds and Seconds
- added a list-like data structure (
Chain
) which is specialized for int values to save memory (~ 25%) and to avoid unnecessary boxing operations - added preliminary Java 9 support
- added the fix-point computations framework to facilitate the implementation of concurrent, fix-point based analyses
Older releases can be obtained by checking out the repository and going back in the history.