Releases: Guardsquare/proguard-core
Releases · Guardsquare/proguard-core
9.1.6
Java support
- Update maximum supported Java class version to 67.65535 (Java 23).
API changes
- Make
CallGraph
reconstruction/traversal methods generic in that they now take aSet<MethodSignature>
to determine when to stop exploration - Delete
EntryPoint
class
Bugfixes
- Fix incorrect traversal direction in
predecessorsContain
.
9.1.5
Bugfixes
- Prevent
unknown enum value for KmVersionRequirementVersionKind
exception when processing code compiled with an outdated Kotlin version. - Fix
UnknownReferenceValue
return wrong string format ingetType
. - Fix
ReflectionExecutor
not updating instance ofStringBuilder
s in fallback result.
API changes
Executor
s do not supportMethodSignature
wildcards anymore. The assumption fromExecutorLookup
is now that all the signatures supported by the executor are declared explicitly ingetSupportedMethodSignatures
.StringExecutor
,ExecutingInvocationUnit
, andJvmValueBamCpaRun
now need the library class pool as parameter.- Calls to
InstructionSequenceBuilder.ldc
now optionally accept aConstantVisitor
. The visitor will visit the constant that is referenced by the added instruction.
9.1.4
Version 9.1.4
Improved
- Add support for dynamic dispatch in
ExecutorInvocationUnit
. This makes it possible to execute methods based on statically observed types of objects, not only based on the type of the used variables.
API changes
- Remove
ExecutorMatcher
and change theExecutor
interface so that it declares supported methods byMethodSignature
wildcards instead. - Add
@Nullable
annotations toMethodSignature
.
Kotlin support
- Update Kotlin dependency to 2.0.0 final release version.
Bugfixes
- Prevent potential
NullPointerException
when Kotlin property metadataisVar
flag does not correctly indicate the presence of a setter.
9.1.3
Version 9.1.3
Kotlin support
- Add support for processing Kotlin 2.0 metadata.
- Update to stable version of the Kotlin metadata library.
9.1.2
Java support
- Update maximum supported Java class version to 66.65535 (Java 22). (#127)
API changes
- Remove deprecated
ReferenceValueFactory
,ParticularReferenceValueFactory
should be used instead. - Deprecate methods in
ValueFactory
taking anObject
as parameter. The alternatives usingParticularObject
should be used instead.
Improved
- Add support for selective parameter reconstruction to define which methods should have their calls evaluated.
- Refactor
ExecutingInvocationUnit
to be customizable using executors. Improve checking whether method instance should be replaced in stack and variables. - Support execution of methods that operate on 1D arrays of all primitive and reference types with
ReflectionExecutor
. - Use runtime type instead of static type when possible in
ExecutingInvocationUnit
. - Introduce
ParticularObject
as the value tracked byParticularReferenceValue
. This makes explicit which kind of values can be tracked during the analysis, and introduces the possibility of tracking a model of the values that differ from the actual tracked object.
Bug fixes
- Improve Kotlin MultiFileFacade metadata assertions to detect uninitialized references.
- Fix handling of category 2 values in
JvmValueTransferRelation
to work correctly withExecutingInvocationUnit
. - Fix concurrency problems in CallGraph and ValueFactory ids.
- Fix a bug in
ReturnClassExtractor
returning the last parameter type instead of null for primitive return values. - Fix
ExecutorMethodSignatureMatcher
trying to mutate an immutable map. - Fix
TypedReferenceValue.cast()
not handling null values correctly.
9.1.1
Version 9.1.1
Bugfixes
- Enable fix previously behind system property: fix
TypedReferenceValue.generalize()
not settingmayBeExtension
to true when generalizing to common parent type. - Avoid printing
PartialEvaluator
messages when anExcessiveComplexityException
occurs. - Fix incorrect writing of flags for type parameters with name annotations.
- Fix incorrect writing of flags for reified type parameters.
- Fix model for types and type parameters, removing the incorrect
HAS_ANNOTATION
common flag.
Improved
- Enable new
PartialEvaluator
error message format by default. - Add the ability to implement a custom renaming strategy for
ClassReferenceFixer
. - Add new
MaxStackSizeComputer
to compute the maximum stack size of a code attribute which is more memory efficient than the existingStackSizeComputer
. - Add
IdentifiedArrayReferenceValue.generalize()
to maintainID
when applied to two instances with sameID
.
9.1.0
Version 9.1
New
- Added
PartialEvaluator
JSON output for use with the new proguard-core-visualizer tool. - Improve
PartialEvaluator
error messages when enabled withPartialEvaluator.Builder.setPrettyPrinting()
.
Improved
- Improve documentation for the
PartialEvaluator
https://guardsquare.github.io/proguard-core/partialevaluator.html.
Bug fixes
- Fix
UnsupportedOperationException
when trying to shrink Kotlin metadata from a lambda function.
API Changes
- No longer consider Record attributes empty when they have no components in
NonEmptyAttributeFilter
. (#118) - Add new
ProguardCoreException
subclasses with more specific meanings.
9.0.10
Improved
TaintSink
can now be configured with a predicate to filter on whichTaintSource
s trigger it.- Improve performance of
DynamicClassReferenceInitializer
. - Improve performance of
DynamicClassMemberReferenceInitializer
.
API changes
- The constructors in
JvmInvokeTaintSink
are now deprecated,JvmInvokeTaintSink#Builder
should be used instead. MultiTypedReferenceValue.generalize()
now removes thenull
type from the set of potential types, and setsmaybeNull
on the other types instead.
9.0.9
Kotlin support
- Add support for processing Kotlin 1.9 metadata.
- Update
kotlinx
metadata dependency to version 0.6.0.
Java support
- Update maximum supported Java class version to 65.65535 (Java 21).
Improved
- Added support for adding line numbers in the
CodeAttributeEditor
. - Improve performance of
ClassReferenceInitializer
when initializing Kotlin type aliases. - Improve performance of
ClassPool.removeClass
. - Allow more configuration of
ExecutingInvocationUnit
by usingExecutingInvocationUnit.Builder
. - Add a mode to
ExecutingInvocationUnit
to approximate reference of types not supported for the execution via reflection. - Implement
Autocloseable
inDataEntryWriter
interface. JvmTransferRelation
does not store anymore static variables with default value, reducing the dataflow analysis state space.
Bug fixes
- Use program location as hash code for
JvmAbstractState
to allow correct use with hash sets. - Fix a bug in
JvmTransferRelation
handling arithmetic instructions returning category 2 values incorrectly. - Fix delegation of
proguard.evaluation.value.ParticularValueFactory#createReferenceValueNull()
.
API changes
- The key used for fields in
JvmAbstractState
has been updated to include the field type to disambiguate between
overloaded fields. - Replace
allNodes
field inproguard.analysis.cpa.defaults.Cfa
withgetAllNodes
method to save memory. - Constructor for
ExecutingInvocationUnit
is deprecated, useExecutingInvocationUnit.Builder
instead.
9.0.8
Improved
- Increase
proguard.classfile.VersionConstants.MAX_SUPPORTED_VERSION
to64.65535
(Java 20 + preview enabled). - Fix tracking of
IdentifiedReferenceValue
IDs. - Add new Kotlin visitor SAM interfaces:
KotlinClassVisitor
,KotlinFileFacadeVisitor
,
KotlinMultiFileFacadeVisitor
,KotlinMultiFilePartVisitor
,KotlinSyntheticClassVisitor
.
API changes
JvmTransferRelation
has been refactored to modelIINC
in a separatecomputeIncrement
method.- The
ProcessingFlag.DONT_PROCESS_KOTLIN_MODULE
value was changed from0x00002000
to0x00008000
. - Remove
fromClassPool
suffixes inCfaUtil
methods. - Refactor
CodeLocation
to only take the signature and offset into consideration. IdentifiedReferenceValue
id
field changed fromint
toObject
.ParticularValueFactory.ReferenceFactory
replaced byParticularReferenceValueFactory
.- Add
ValueFactory.createReferenceValue(String type, Clazz referencedClass, boolean mayBeExtension, boolean maybeNull, Clazz creationClass, Method creationMethod, int creationOffset)
to allow creating references identified by their creation site. - Add
JvmCfaReferenceValueFactory
to create references identified by theJvmCfaNode
creation site.
Upgrade considerations
Identified and particular references can now be identified by any Object
instead of a simple int
.
However, this means that code which compared the IDs may need to be modified. For example, the following
code should be changed:
public static boolean equal(IdentifiedReferenceValue a, IdentifiedReferenceValue b) {
return a.id == b.id;
}
It should use the equals
method instead.
public static boolean equal(IdentifiedReferenceValue a, IdentifiedReferenceValue b) {
return a.id.equals(b.id);
}
The ParticularReferenceValueFactory
identifies references with integers by default:
ValueFactory valueFactory = new ParticularReferenceFactory(new ParticularReferenceValueFactory());
Value a = valueFactory.createReferenceValue("Ljava/lang/String;", clazz, false, false);
// a.id will be an integer.
Any Object
can be used as an ID using the createReferenceValueForId
method:
String objectId = "myId";
ValueFactory valueFactory = new ParticularReferenceFactory(new ParticularReferenceValueFactory());
Value a = valueFactory.createReferenceValueForId("Ljava/lang/String;", clazz, false, false, objectId);
// a.id will be objectId