Menu

#583 StringIndexOutOfBoundsException on array as a type variable bound

v5.2
closed-fixed
None
5
2016-10-23
2015-09-17
No

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)

Discussion

  • Alexander Udalov

    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

     
  • Eric Lafortune

    Eric Lafortune - 2015-09-17

    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:):

    case ClassConstants.TYPE_ARRAY:
    

    This fix will be included in the upcoming ProGuard 5.3.

     
  • Eric Lafortune

    Eric Lafortune - 2015-09-17
    • status: open --> open-fixed
    • assigned_to: Eric Lafortune
     
  • Alexander Udalov

    Eric, thank you so much! Looking forward for the release.

     
  • Eric Lafortune

    Eric Lafortune - 2016-10-23
    • Status: open-fixed --> closed-fixed
     

Log in to post a comment.