You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Test.java 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import javassist.*;
  4. @SuppressWarnings("unused")
  5. class InvalidStackMapFrame {
  6. public void bytecodeVerifyError1() {
  7. String[] newLine = new String[10];
  8. for (int i = 0; i < 5; i++) {
  9. String a = newLine[1];
  10. newLine[4] = a;
  11. }
  12. }
  13. public void bytecodeVerifyError() {
  14. // javassist bug : invalid stack map frame
  15. List<Integer> test = new ArrayList<Integer>();
  16. String[] newLine = new String[10];
  17. for (Integer idx : test) {
  18. // invalid stackMapFrame
  19. // FRAME FULL [bug_regression_jdk7/javassist/InvalidStackMapFrame java/util/ArrayList java/lang/Object java/util/Iterator T T T I] []
  20. // java/lang/Object is wrong -> [Ljava/lang/String; is correct
  21. String address = newLine[1];
  22. int tabPos = -1;
  23. if (tabPos != -1) {
  24. address = address.substring(tabPos + 1);
  25. }
  26. newLine[4] = address;
  27. }
  28. }
  29. }
  30. public class Test {
  31. private static final String INVALID_STACK_MAP_FRAME = "InvalidStackMapFrame";
  32. public static void main(String[] args) throws Exception {
  33. // CustomURLClassLoader classLoader = new CustomURLClassLoader(new URL[]{}, Thread.currentThread().getContextClassLoader());
  34. ClassPool classPool = ClassPool.getDefault();
  35. // classPool.appendClassPath(new LoaderClassPath(classLoader));
  36. final CtClass ctClass = classPool.get(INVALID_STACK_MAP_FRAME);
  37. final CtMethod method = ctClass.getDeclaredMethod("bytecodeVerifyError");
  38. // method.addLocalVariable("test_localVariable", CtClass.intType);
  39. method.insertBefore("{ java.math.BigDecimal d = null; d.divide(d); }");
  40. //ctClass.debugWriteFile();
  41. System.out.println("ok");
  42. ctClass.writeFile();
  43. Class<?> cc = ctClass.toClass();
  44. System.out.println(cc.getName());
  45. InvalidStackMapFrame obj = (InvalidStackMapFrame)cc.getDeclaredConstructor().newInstance();
  46. obj.bytecodeVerifyError();
  47. }
  48. }