proguard icon indicating copy to clipboard operation
proguard copied to clipboard

NullPointerException at proguard.optimize.info.SimpleEnumMarker.isSimpleEnum

Open ollierob opened this issue 5 years ago • 1 comments

Trying to shrink an uber-jar but Proguard seems to be generating an NPE.

Company code so unfortunately I can't share the source. In any case the stack trace doesn't seem to tell me anything about the enum causing it.

Building with proguard-maven-plugin:2.2.0 which I believe uses Proguard base 6.1.1. Tried upgrading it to use 6.2.2 (latest in Maven) but same problem. This is operating on a ~50mb jar created by the maven-shade-plugin.

Here are the options I'm adding:

-dontobfuscate
-dontnote
-dontwarn
-keep class com.company.Main { *; }

Here's the complete stack trace:

 [proguard] Initializing...
 [proguard] Ignoring unused library classes...
 [proguard]   Original number of library classes: 19440
 [proguard]   Final number of library classes:    1881
 [proguard] Printing kept classes, fields, and methods...
 [proguard] Inlining subroutines...
 [proguard] Shrinking...
 [proguard] Removing unused program classes and class elements...
 [proguard]   Original number of program classes: 29270
 [proguard]   Final number of program classes:    3475
 [proguard] Optimizing (pass 1/1)...
 [proguard] java.lang.NullPointerException
 [proguard]     at proguard.optimize.info.SimpleEnumMarker.isSimpleEnum(SimpleEnumMarker.java:68)
 [proguard]     at proguard.optimize.evaluation.SimpleEnumUseSimplifier.isSimpleEnum(SimpleEnumUseSimplifier.java:578)
 [proguard]     at proguard.optimize.evaluation.SimpleEnumUseSimplifier.isPoppingSimpleEnum(SimpleEnumUseSimplifier.java:540)
 [proguard]     at proguard.optimize.evaluation.SimpleEnumUseSimplifier.isPoppingSimpleEnum(SimpleEnumUseSimplifier.java:527)
 [proguard]     at proguard.optimize.evaluation.SimpleEnumUseSimplifier.visitConstantInstruction(SimpleEnumUseSimplifier.java:315)
 [proguard]     at proguard.classfile.instruction.ConstantInstruction.accept(ConstantInstruction.java:157)
 [proguard]     at proguard.optimize.evaluation.SimpleEnumUseSimplifier.visitCodeAttribute(SimpleEnumUseSimplifier.java:132)
 [proguard]     at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:141)
 [proguard]     at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:101)
 [proguard]     at proguard.classfile.attribute.visitor.AllAttributeVisitor.visitProgramMember(AllAttributeVisitor.java:95)
 [proguard]     at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:93)
 [proguard]     at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:93)
 [proguard]     at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:588)
 [proguard]     at proguard.classfile.visitor.AllMethodVisitor.visitProgramClass(AllMethodVisitor.java:47)
 [proguard]     at proguard.classfile.ProgramClass.accept(ProgramClass.java:430)
 [proguard]     at proguard.classfile.ClassPool.classesAccept(ClassPool.java:125)
 [proguard]     at proguard.classfile.visitor.AllClassVisitor.visitClassPool(AllClassVisitor.java:45)
 [proguard]     at proguard.classfile.ClassPool.accept(ClassPool.java:111)
 [proguard]     at proguard.optimize.Optimizer$TimedClassPoolVisitor.visitClassPool(Optimizer.java:1702)
 [proguard]     at proguard.classfile.ClassPool.accept(ClassPool.java:111)
 [proguard]     at proguard.optimize.Optimizer.execute(Optimizer.java:676)
 [proguard]     at proguard.ProGuard.optimize(ProGuard.java:444)
 [proguard]     at proguard.ProGuard.execute(ProGuard.java:165)
 [proguard]     at proguard.ProGuard.main(ProGuard.java:591)

ollierob avatar Aug 21 '20 09:08 ollierob

The options -dontnote and -dontwarn may be hiding problems in the input. If you comment them out, do you see any warnings about inconsistent code, e.g. library classes that depend on program classes?

As a workaround, you can try disabling enum optimization: -optimizations !class/unboxing/enum

EricLafortune avatar Aug 24 '20 21:08 EricLafortune