java.lang.ArrayIndexOutOfBoundsException using ASM 5.2
Hi, I am using CheckClassAdapter of Asm 5.2 to verify a class of java 1.5 which is modified by me with Asm; But it occureded the following error:
java.lang.ArrayIndexOutOfBoundsException: 29442
at org.objectweb.asm.ClassReader.readLabel(ClassReader.java:2260)
at org.objectweb.asm.ClassReader.readFrameType(ClassReader.java:2240)
at org.objectweb.asm.ClassReader.readFrame(ClassReader.java:2173)
at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1364)
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1035)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:708)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:521)
at AsmDebug.main(AsmDebug.java:23)
The following are my operation:
- Firstly, I add my own method into this class(JETTY 7.5.6 : org.eclipse.jetty.server.Server);
- Then ,I try to verify availiability the of that class with CheckClassAdapter and my source is as follows:
inputStream = new FileInputStream("Server.7.5.6.class");
//inputStream = new FileInputStream("Server.8.1.8.class");
//inputStream = new FileInputStream("Server.9.2.14.class");
//inputStream = new FileInputStream("Server.9.4.6.class");
ClassReader classReader = new ClassReader(inputStream);
ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_FRAMES);
ClassVisitor classVisitor = new CheckClassAdapter(classWriter, true);
23: **classReader.accept(classVisitor, 0);**//Error occurd here ******
stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
CheckClassAdapter.verify(new ClassReader(classWriter.toByteArray()), true, printWriter);
I have tried to trace the error into asm code but stoped at the following point :
private int readFrameType(final Object[] frame, final int index, int v,
final char[] buf, final Label[] labels) {
int type = b[v++] & 0xFF;
switch (type) {
case 0:
frame[index] = Opcodes.TOP;
break;
case 1:
frame[index] = Opcodes.INTEGER;
break;
case 2:
frame[index] = Opcodes.FLOAT;
break;
case 3:
frame[index] = Opcodes.DOUBLE;
break;
case 4:
frame[index] = Opcodes.LONG;
break;
case 5:
frame[index] = Opcodes.NULL;
break;
case 6:
frame[index] = Opcodes.UNINITIALIZED_THIS;
break;
case 7: // Object
frame[index] = readClass(v, buf);
v += 2;
break;
default: // Uninitialized
** frame[index] = readLabel(readUnsignedShort(v), labels);**//key point is here
v += 2;
}
return v;
}
I don't understand the error meaning about 'Uninitialized' branch ;Besides , I used the same operations in Jetty version 8.1.8 、9.2.14、9.4.6 and it's successful; Hope for your advice and heap . My modified bytecode is as follows by javap tool: javap_bytecode