From: rtrimana Date: Tue, 16 Jul 2019 20:22:12 +0000 (-0700) Subject: Fixing a bug in ClassLoader.defineClass(); basically this method has to still return... X-Git-Url: http://plrg.eecs.uci.edu/git/?p=jpf-core.git;a=commitdiff_plain;h=c78c0cceae830f46be14d3653aea07ada73e585e Fixing a bug in ClassLoader.defineClass(); basically this method has to still return a java.lang.LinkageError exception when it attempts to define the same class twice. --- diff --git a/examples/SunClassLoader.java b/examples/SunClassLoader.java index 7d022c6..49b8117 100644 --- a/examples/SunClassLoader.java +++ b/examples/SunClassLoader.java @@ -28,6 +28,7 @@ public class SunClassLoader extends ClassLoader implements Opcodes { protected void define(byte[] bytes, final String name) { //knownClasses.put(name, defineClass(name, bytes, 0, bytes.length)); Class cls = defineClass(name, bytes, 0, bytes.length); + //Class cls2 = defineClass(name, bytes, 0, bytes.length); } protected final Map knownClasses = new HashMap(); @@ -36,6 +37,6 @@ public class SunClassLoader extends ClassLoader implements Opcodes { SunClassLoader sun = new SunClassLoader(); sun.loadMagic(); - Class cls = sun.loadClass("java/lang/Object"); + //Class cls = sun.loadClass("java/lang/Object"); } } diff --git a/jpf.properties b/jpf.properties index f4f093d..8942678 100644 --- a/jpf.properties +++ b/jpf.properties @@ -22,6 +22,7 @@ jpf-core.native_classpath=\ jpf-core.classpath=\ ${jpf-core}/build/jpf-classes.jar;\ + ${jpf-core}/build/asm-7.1.jar;\ ${jpf-core}/build/examples jpf-core.sourcepath=\ @@ -419,7 +420,7 @@ listener.gov.nasa.jpf.Const=gov.nasa.jpf.tools.ConstChecker ### PreciseRaceDetector # we don't check for races in standard libraries -race.exclude=java.*,javax.*,groovy.*,org.* +race.exclude=java.*,javax.* ############################### 5. test part ############################# diff --git a/src/examples/Racer.java b/src/examples/Racer.java index 227cfab..c53bb48 100644 --- a/src/examples/Racer.java +++ b/src/examples/Racer.java @@ -16,28 +16,28 @@ * limitations under the License. */ -public class Racer implements Runnable { - - int d = 42; - +public class Racer implements Runnable { + + int d = 42; + @Override - public void run () { - doSomething(1001); // (1) - d = 0; // (2) - } - - public static void main (String[] args){ - Racer racer = new Racer(); - Thread t = new Thread(racer); - t.start(); - - doSomething(1000); // (3) - int c = 420 / racer.d; // (4) - System.out.println(c); - } - - static void doSomething (int n) { - // not very interesting.. - try { Thread.sleep(n); } catch (InterruptedException ix) {} - } -} + public void run () { + doSomething(1001); // (1) + d = 0; // (2) + } + + public static void main (String[] args){ + Racer racer = new Racer(); + Thread t = new Thread(racer); + t.start(); + + doSomething(1000); // (3) + int c = 420 / racer.d; // (4) + System.out.println(c); + } + + static void doSomething (int n) { + // not very interesting.. + try { Thread.sleep(n); } catch (InterruptedException ix) {} + } +} 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 f6eb53d..cfea25c 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 @@ -143,9 +143,10 @@ public class JPF_java_lang_ClassLoader extends NativePeer { ClassLoaderInfo cl = env.getClassLoaderInfo(objRef); // determine whether that the corresponding class is already defined by this - // classloader, if so, just return the already defined class! + // classloader, if so, this attempt is invalid, and loading throws a LinkageError if (cl.getDefinedClassInfo(cname) != null) { // attempt to define twice - return cl.getDefinedClassInfo(cname).getClassObjectRef(); + env.throwException("java.lang.LinkageError"); + return MJIEnv.NULL; } byte[] buffer = env.getByteArrayObject(bufferRef); @@ -180,8 +181,16 @@ public class JPF_java_lang_ClassLoader extends NativePeer { int sysObjRef = env.getSystemClassLoaderInfo().getClassLoaderObjectRef(); if (objRef != sysObjRef) { - return defineClass0__Ljava_lang_String_2_3BII__Ljava_lang_Class_2 - (env, sysObjRef, nameRef, bufferRef, offset, length); + // Check if this class has been defined in the SystemClassLoader + ClassLoaderInfo cl = env.getSystemClassLoaderInfo(); + String cname = env.getStringObject(nameRef); + if (cl.getDefinedClassInfo(cname) != null) { + ClassInfo ci = cl.getResolvedClassInfo(cname); + return ci.getClassObjectRef(); + } else { + return defineClass0__Ljava_lang_String_2_3BII__Ljava_lang_Class_2 + (env, sysObjRef, nameRef, bufferRef, offset, length); + } } env.throwException("java.lang.ClassNotFoundException"); return MJIEnv.NULL;