From 8ceaed854b3ff0017faf944e3e51b0642fb23c28 Mon Sep 17 00:00:00 2001 From: rtrimana Date: Mon, 8 Jul 2019 13:42:33 -0700 Subject: [PATCH] Fixing JPF for methodMissing() method in Groovy: 1) Bug in detecting the array type, 2) Different expected responses for ClassNotFoundException vs. ClassDefNotFoundException. --- examples/Reflection.java | 16 +++++++++++++--- examples/SunClassLoader.java | 3 +++ src/main/gov/nasa/jpf/vm/ClassInfo.java | 6 ++++++ src/main/gov/nasa/jpf/vm/Types.java | 3 ++- .../nasa/jpf/vm/JPF_java_lang_ClassLoader.java | 16 +++++++++++----- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/examples/Reflection.java b/examples/Reflection.java index e486890..801940e 100644 --- a/examples/Reflection.java +++ b/examples/Reflection.java @@ -12,6 +12,8 @@ import java.util.Collection; import java.math.BigInteger; import java.security.ProtectionDomain; +import java.beans.Introspector; + public class Reflection { interface GenericSuperShort { @@ -52,14 +54,22 @@ public class Reflection { }*/ } - public static void main(String[] args) { + public static void main(String[] args) throws Exception { //BigInteger bi = new BigInteger("-1"); //System.out.println(bi); - StringBuilder sb = new StringBuilder(0); + /*StringBuilder sb = new StringBuilder(0); sb.append('['); sb.append(']'); - System.out.println(sb.toString()); + System.out.println(sb.toString());*/ + + //Class cls = Class.forName("groovy.runtime.metaclass.Logger.LoggerMetaClass"); + //Class cls2 = Class.forName("groovy.runtime.metaclass.[Ljava.lang.Object;MetaClass"); + //Class cls2 = Class.forName("[Ljava.lang.Object;BeanInfo"); + Class cls = Object[].class; + System.out.println("Bean introspection do not ignore bean info: " + cls.getSimpleName()); + System.out.println("Bean introspection do not ignore bean info: " + cls.getName()); + Object obj = Introspector.getBeanInfo(cls); /* TODO: Enumerate all methods in Class.class Method[] methods = Collection.class.getMethods(); diff --git a/examples/SunClassLoader.java b/examples/SunClassLoader.java index 195c3a6..7d022c6 100644 --- a/examples/SunClassLoader.java +++ b/examples/SunClassLoader.java @@ -9,6 +9,7 @@ import java.util.HashMap; * Special class loader, which when running on Sun VM allows to generate accessor classes for any method */ public class SunClassLoader extends ClassLoader implements Opcodes { + private void loadMagic() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cw.visit(Opcodes.V1_4, Opcodes.ACC_PUBLIC, "sun/reflect/GroovyMagic", null, "sun/reflect/MagicAccessorImpl", null); @@ -34,5 +35,7 @@ public class SunClassLoader extends ClassLoader implements Opcodes { public static void main(String[] args) { SunClassLoader sun = new SunClassLoader(); sun.loadMagic(); + + Class cls = sun.loadClass("java/lang/Object"); } } diff --git a/src/main/gov/nasa/jpf/vm/ClassInfo.java b/src/main/gov/nasa/jpf/vm/ClassInfo.java index abc9499..3ff7ca6 100644 --- a/src/main/gov/nasa/jpf/vm/ClassInfo.java +++ b/src/main/gov/nasa/jpf/vm/ClassInfo.java @@ -1813,6 +1813,12 @@ public class ClassInfo extends InfoObject implements Iterable, Gener public static boolean isBuiltinClass (String cname) { char c = cname.charAt(0); + // TODO: Fix for Groovy's model-checking + // TODO: Handling impossible names in Groovy, e.g., [Ljava.lang.Object;BeanInfo + if (cname.indexOf(';') != -1 && cname.indexOf(';') != cname.length() - 1) { + return false; + } + // array class if ((c == '[') || cname.endsWith("[]")) { return true; diff --git a/src/main/gov/nasa/jpf/vm/Types.java b/src/main/gov/nasa/jpf/vm/Types.java index 981ac10..2f1cc99 100644 --- a/src/main/gov/nasa/jpf/vm/Types.java +++ b/src/main/gov/nasa/jpf/vm/Types.java @@ -769,7 +769,8 @@ public class Types { return typeName; } - int i=typeName.indexOf('['); + // TODO: Fix for Groovy's model-checking + int i=typeName.indexOf("[]"); if (i>0){ // the sort of "[]" StringBuilder sb = new StringBuilder(); sb.append('['); diff --git a/src/peers/gov/nasa/jpf/vm/JPF_java_lang_ClassLoader.java b/src/peers/gov/nasa/jpf/vm/JPF_java_lang_ClassLoader.java index 25a1dcf..f6eb53d 100644 --- a/src/peers/gov/nasa/jpf/vm/JPF_java_lang_ClassLoader.java +++ b/src/peers/gov/nasa/jpf/vm/JPF_java_lang_ClassLoader.java @@ -112,13 +112,18 @@ public class JPF_java_lang_ClassLoader extends NativePeer { public int findSystemClass__Ljava_lang_String_2__Ljava_lang_Class_2 (MJIEnv env, int objRef, int nameRef) { String cname = env.getStringObject(nameRef); - checkForIllegalName(env, cname); - if(env.hasException()) { - return MJIEnv.NULL; - } - ClassLoaderInfo cl = ClassLoaderInfo.getCurrentSystemClassLoader(); + // TODO: Fix for Groovy's model-checking + // Get a clean class name and try to resolve + ClassInfo cir = cl.getAlreadyResolvedClassInfo(Types.getClassNameFromTypeName(cname)); + if (cir != null) { + checkForIllegalName(env, cname); + if(env.hasException()) { + return MJIEnv.NULL; + } + } + ClassInfo ci = cl.getResolvedClassInfo(cname); if(!ci.isRegistered()) { @@ -210,6 +215,7 @@ public class JPF_java_lang_ClassLoader extends NativePeer { } if((name.indexOf('/') != -1) || (name.charAt(0) == '[')) { + //env.throwException("java.lang.ClassNotFoundException", "IllegalName: " + name); env.throwException("java.lang.NoClassDefFoundError", "IllegalName: " + name); } } -- 2.34.1