StringIndexOutOfBoundsException on array as a type variable bound
Java class file shrinker, optimizer, obfuscator, and preverifier
Brought to you by:
guardsquare
It seems that ProGuard fails with exception on a type variable, the upper bound of which is an array. This is not allowed in Java, but is legal according to the JVM spec (http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.9).
To reproduce the exception, run:
java -cp proguard.jar proguard.classfile.util.DescriptorClassEnumeration '<T:Ljava lang="" Object;A:[TT;="">(TA;I)TA;'
Stack trace:
java.lang.StringIndexOutOfBoundsException: String index out of range: 37 at java.lang.String.charAt(String.java:646) at proguard.classfile.util.DescriptorClassEnumeration.nextFluff(DescriptorClassEnumeration.java:173) at proguard.classfile.util.DescriptorClassEnumeration.classCount(DescriptorClassEnumeration.java:69) at proguard.classfile.util.ClassReferenceInitializer.findReferencedClasses(ClassReferenceInitializer.java:500) at proguard.classfile.util.ClassReferenceInitializer.visitSignatureAttribute(ClassReferenceInitializer.java:340) at proguard.classfile.util.SimplifiedVisitor.visitSignatureAttribute(SimplifiedVisitor.java:339) at proguard.classfile.util.SimplifiedVisitor.visitSignatureAttribute(SimplifiedVisitor.java:351) at proguard.classfile.attribute.SignatureAttribute.accept(SignatureAttribute.java:109) at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:81) at proguard.classfile.util.ClassReferenceInitializer.visitProgramMethod(ClassReferenceInitializer.java:139) at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:73) at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:516) at proguard.classfile.util.ClassReferenceInitializer.visitProgramClass(ClassReferenceInitializer.java:104) at proguard.classfile.ProgramClass.accept(ProgramClass.java:358) at proguard.classfile.ClassPool.classesAccept(ClassPool.java:124) at proguard.Initializer.execute(Initializer.java:146) at proguard.ProGuard.initialize(ProGuard.java:233) at proguard.ProGuard.execute(ProGuard.java:98) at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074)
If you're interested, this happened for users of Kotlin (kotlinlang.org) after the update to M13. Arrays are legal as upper bounds of type parameters in Kotlin, and the M13 release introduced a bunch of new generic functions on arrays in the standard library, which failed for users using ProGuard: https://youtrack.jetbrains.com/issue/KT-9184
Thanks for the report. That's an interesting case. It seems that the problem can be fixed by adding this line in src/proguard/classfile/util/DescriptorClassEnumeration.java at line 139 (after ClassConstants.TYPE_GENERIC_BOUND:):
This fix will be included in the upcoming ProGuard 5.3.
Eric, thank you so much! Looking forward for the release.