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;'</t:ljava>
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.