ArrayIndexOutOfBoundException on certain Type Annotations
I am using ASM 5.1 as part of JaCoCo 0.7.7 (jacoco-maven-plugin), and I get the
following exception when using some type annotations:
java.lang.instrument.IllegalClassFormatException: Error while instrumenting
class com/ennit/sal/index/api/model/value/BinaryValue.
at
org.jacoco.agent.rt.internal_6da5971.CoverageTransformer.transform(CoverageTran
sformer.java:93)
at
sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at
sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at
com.ennit.sal.index.api.model.WritableRecordAutoTest.data(WritableRecordAutoTes
t.java:82)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.ja
va:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.jav
a:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java
:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:
47)
at
org.junit.runners.Parameterized.allParameters(Parameterized.java:280)
at org.junit.runners.Parameterized.<init>(Parameterized.java:248)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessor
Impl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructor
AccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at
org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:
104)
at
org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.ja
va:86)
at
org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at
org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDe
faultPossibilitiesBuilder.java:26)
at org.junit.runner.Computer.getRunner(Computer.java:40)
at org.junit.runner.Computer$1.runnerForClass(Computer.java:31)
at
org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at
org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87)
at org.junit.runners.Suite.<init>(Suite.java:81)
at org.junit.runner.Computer.getSuite(Computer.java:28)
at org.junit.runner.Request.classes(Request.java:75)
at org.junit.runner.Request.classes(Request.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.ja
va:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.apache.maven.surefire.common.junit4.JUnit4Reflector.createRequest(JUnit4Ref
lector.java:63)
at
org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.createSuiteDescripti
on(JUnit4ProviderUtil.java:113)
at
org.apache.maven.surefire.junit4.JUnit4Provider.createTestsDescription(JUnit4Pr
ovider.java:257)
at
org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
at
org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(F
orkedBooter.java:203)
at
org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.j
ava:155)
at
org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.io.IOException: Error while instrumenting class
com/ennit/sal/index/api/model/value/BinaryValue.
at
org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrumentError(In
strumenter.java:160)
at
org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrum
enter.java:111)
at
org.jacoco.agent.rt.internal_6da5971.CoverageTransformer.transform(CoverageTran
sformer.java:91)
... 52 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 70
at
org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.readLabel(ClassReader.java
:2184)
at
org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.readTypeAnnotations(ClassR
eader.java:1611)
at
org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.readCode(ClassReader.java:
1186)
at
org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.readMethod(ClassReader.jav
a:1017)
at
org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.accept(ClassReader.java:69
3)
at
org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.accept(ClassReader.java:50
6)
at
org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrum
enter.java:84)
at
org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrum
enter.java:108)
... 53 more
The code part in question is:
@Override
public int compareTo(final BinaryValue aOther) {
final byte @NonNull [] thisValue = getValue();
final byte @NonNull [] otherValue = aOther.getValue();
final int len = Math.min(thisValue.length, otherValue.length);
for (int i = 0; i < len; i++) {
final int c = Byte.compare(thisValue[i], otherValue[i]);
if (c != 0) {
return c;
}
}
// shorter value first, if prefixes are identical
return Integer.compare(thisValue.length, otherValue.length);
}
If I omit the @NonNull annotations on the arrays in this way:
@Override
public int compareTo(final BinaryValue aOther) {
final byte [] thisValue = getValue();
final byte [] otherValue = aOther.getValue();
final int len = Math.min(thisValue.length, otherValue.length);
for (int i = 0; i < len; i++) {
final int c = Byte.compare(thisValue[i], otherValue[i]);
if (c != 0) {
return c;
}
}
// shorter value first, if prefixes are identical
return Integer.compare(thisValue.length, otherValue.length);
}
Everything works fine