Variable frame is too small compared to other frame
Java class file shrinker, optimizer, obfuscator, and preverifier
Brought to you by:
guardsquare
Hello,
I have a strange error with Proguard 6.0.3. The same JAR works with Proguard 5.3.3. I have not tested other 6.x releases.
Command line:
java -Xmx2G -Doptimize.conservatively -jar proguard.jar -include build.pro -injars freehepvg.jar -outjars freehepvg.out.jar
Console output:
Unexpected error while performing partial evaluation:
Class = [org/freehep/do]
Method = [a(ILorg/freehep/ee;)V]
Exception = [java.lang.IllegalArgumentException] (Variable frame is too small [0] compared to other frame [4])
java.lang.RuntimeException: java.lang.IllegalArgumentException: Variable frame is too small [0] compared to other frame [4]
at proguard.classfile.visitor.ParallelAllClassVisitor.visitClassPool(ParallelAllClassVisitor.java:126)
at proguard.classfile.ClassPool.accept(ClassPool.java:110)
at proguard.optimize.Optimizer$TimedClassPoolVisitor.visitClassPool(Optimizer.java:1684)
at proguard.classfile.ClassPool.accept(ClassPool.java:110)
at proguard.optimize.Optimizer.execute(Optimizer.java:1392)
at proguard.ProGuard.optimize(ProGuard.java:413)
at proguard.ProGuard.execute(ProGuard.java:154)
at proguard.ProGuard.main(ProGuard.java:572)
Caused by: java.lang.IllegalArgumentException: Variable frame is too small [0] compared to other frame [4]
at proguard.evaluation.Variables.initialize(Variables.java:96)
at proguard.evaluation.TracedVariables.initialize(TracedVariables.java:110)
at proguard.optimize.evaluation.PartialEvaluator.evaluateSingleInstructionBlock(PartialEvaluator.java:793)
at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:723)
at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(PartialEvaluator.java:681)
at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute0(PartialEvaluator.java:317)
at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute(PartialEvaluator.java:230)
at proguard.optimize.evaluation.LivenessAnalyzer.visitCodeAttribute(LivenessAnalyzer.java:265)
at proguard.optimize.evaluation.VariableOptimizer.visitCodeAttribute(VariableOptimizer.java:105)
at proguard.optimize.info.OptimizationCodeAttributeFilter.visitCodeAttribute(OptimizationCodeAttributeFilter.java:84)
at proguard.classfile.attribute.visitor.DebugAttributeVisitor.visitCodeAttribute(DebugAttributeVisitor.java:302)
at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:141)
at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:101)
at proguard.classfile.attribute.visitor.AllAttributeVisitor.visitProgramMember(AllAttributeVisitor.java:95)
at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:93)
at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:93)
at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:588)
at proguard.classfile.visitor.AllMethodVisitor.visitProgramClass(AllMethodVisitor.java:47)
at proguard.classfile.ProgramClass.accept(ProgramClass.java:430)
at proguard.classfile.visitor.ParallelAllClassVisitor$MyThreadedClassVisitor$1.run(ParallelAllClassVisitor.java:197)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
The input JAR and build script are in the attached ZIP file.
In addition, I still have preverification issues on other codes when I enable inlining optimizations, this is why I disable these optimization (with Java 7 and 8, not tested with Java 9). No issue with Java 6.
Best regard,
Reproduced with latest 6.2.0 release.
Problem only happens when using conservative optimization. In this case surprisingly more code is removed resulting in a case where a return instruction is removed after a branch instruction leading to the follow up error.