Skip to content

Releases: Guardsquare/proguard-core

9.1.6

22 Aug 15:23
Compare
Choose a tag to compare

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 a Set<MethodSignature> to determine when to stop exploration
  • Delete EntryPoint class

Bugfixes

  • Fix incorrect traversal direction in predecessorsContain.

9.1.5

17 Jul 14:34
Compare
Choose a tag to compare

Bugfixes

  • Prevent unknown enum value for KmVersionRequirementVersionKind exception when processing code compiled with an outdated Kotlin version.
  • Fix UnknownReferenceValue return wrong string format in getType.
  • Fix ReflectionExecutor not updating instance of StringBuilders in fallback result.

API changes

  • Executors do not support MethodSignature wildcards anymore. The assumption from ExecutorLookup is now that all the signatures supported by the executor are declared explicitly in getSupportedMethodSignatures.
  • StringExecutor, ExecutingInvocationUnit, and JvmValueBamCpaRun now need the library class pool as parameter.
  • Calls to InstructionSequenceBuilder.ldc now optionally accept a ConstantVisitor. The visitor will visit the constant that is referenced by the added instruction.

9.1.4

22 May 07:04
bd3ba7f
Compare
Choose a tag to compare

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 the Executor interface so that it declares supported methods by MethodSignature wildcards instead.
  • Add @Nullable annotations to MethodSignature.

Kotlin support

  • Update Kotlin dependency to 2.0.0 final release version.

Bugfixes

  • Prevent potential NullPointerException when Kotlin property metadata isVar flag does not correctly indicate the presence of a setter.

9.1.3

29 Apr 13:06
Compare
Choose a tag to compare

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

04 Apr 16:07
eef07d3
Compare
Choose a tag to compare

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 an Object as parameter. The alternatives using ParticularObject 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 by ParticularReferenceValue. 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 with ExecutingInvocationUnit.
  • 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

29 Nov 17:15
38f2a86
Compare
Choose a tag to compare

Version 9.1.1

Bugfixes

  • Enable fix previously behind system property: fix TypedReferenceValue.generalize() not setting mayBeExtension to true when generalizing to common parent type.
  • Avoid printing PartialEvaluator messages when an ExcessiveComplexityException 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 existing StackSizeComputer.
  • Add IdentifiedArrayReferenceValue.generalize() to maintain ID when applied to two instances with same ID.

9.1.0

23 Aug 13:41
Compare
Choose a tag to compare

Version 9.1

New

  • Added PartialEvaluator JSON output for use with the new proguard-core-visualizer tool.
  • Improve PartialEvaluator error messages when enabled with PartialEvaluator.Builder.setPrettyPrinting().

Improved

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

03 Jul 13:44
Compare
Choose a tag to compare

Improved

  • TaintSink can now be configured with a predicate to filter on which TaintSources 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 the null type from the set of potential types, and sets maybeNull on the other types instead.

9.0.9

07 Jun 16:05
72ff4a8
Compare
Choose a tag to compare

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 using ExecutingInvocationUnit.Builder.
  • Add a mode to ExecutingInvocationUnit to approximate reference of types not supported for the execution via reflection.
  • Implement Autocloseable in DataEntryWriter 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 in proguard.analysis.cpa.defaults.Cfa with getAllNodes method to save memory.
  • Constructor for ExecutingInvocationUnit is deprecated, use ExecutingInvocationUnit.Builder instead.

9.0.8

03 Mar 15:40
16a0462
Compare
Choose a tag to compare

Improved

  • Increase proguard.classfile.VersionConstants.MAX_SUPPORTED_VERSION to 64.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 model IINC in a separate computeIncrement method.
  • The ProcessingFlag.DONT_PROCESS_KOTLIN_MODULE value was changed from 0x00002000 to 0x00008000.
  • Remove fromClassPool suffixes in CfaUtil methods.
  • Refactor CodeLocation to only take the signature and offset into consideration.
  • IdentifiedReferenceValue id field changed from int to Object.
  • ParticularValueFactory.ReferenceFactory replaced by ParticularReferenceValueFactory.
  • 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 the JvmCfaNode 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