Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4800106

VM regression in 1.4.2-b10: "illegal UTF8 string in constant pool"

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P2 P2
    • None
    • 1.4.2
    • hotspot
    • None
    • generic
    • generic

      This is a respin of #4793774, that was originally filed against 1.4.2-b10 javac and (incorrectly, IMO) closed as a duplicate of #4324508.

      The problem seems to be that due to a stricter bytecode verification a code that was compiled with 1.3 javac may be no longer accepted by 1.4.2 VM. Although the tighter check may seem desirable, it may break existing applications built with previous releases of javac.

      A copy of the original bug report by ###@###.### follows:
      -------------------------------------------------------------------------------
      Consider this source file, which is stripped out of:

      http://cvs.apache.org/viewcvs.cgi/xml-xerces/java/src/org/apache/xerces/impl/xpath/regex/Token.java

      ----%<---- Test.java
      public class Test {
          private static final String x1 = "\u0000\u007F\u0080\u00FF\u0100\u017F\u0180\u024F\u0250\u02AF\u02B0\u02FF\u0300\u036F\u0370\u03FF\u0400\u04FF\u0530\u058F\u0590\u05FF\u0600\u06FF\u0700\u074F\u0780\u07BF";
          public static void main(String[] args) {
              StringBuffer buf1 = new StringBuffer(String.valueOf(x1.length()));
              StringBuffer buf2 = new StringBuffer("OK; length=");
              buf2.append(buf1);
              System.out.println(buf2);
          }
      }
      ----%<----

      Compiled under 1.3.1, it can be run on 1.3.1 or 1.4.1_01 but not 1.4.2-beta-b10. Compiled under 1.4.x, it can be run on 1.4.x but not 1.3.1.

      illegalutf8test$ /space/jdk1.3.1_03/bin/javac Test.java
      illegalutf8test$ /space/jdk1.3.1_03/bin/java Test
      OK; length=28
      illegalutf8test$ /space/jdk1.4.1_01/bin/java Test
      OK; length=28
      illegalutf8test$ /space/jdk1.4.2-beta-b10/bin/java Test
      Exception in thread "main" java.lang.ClassFormatError: Test (Illegal UTF8 string in constant pool)
      at java.lang.ClassLoader.defineClass0(Native Method)
      at java.lang.ClassLoader.defineClass(ClassLoader.java:504)
      at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
      at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
      at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
      at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
      at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
      Could not find the main class. Program will exit.
      illegalutf8test$ /space/jdk1.4.1_01/bin/javac Test.java
      illegalutf8test$ /space/jdk1.3.1_03/bin/java Test
      Exception in thread "main" java.lang.NoSuchMethodError
      at Test.main(Test.java:6)
      illegalutf8test$ /space/jdk1.4.1_01/bin/java Test
      OK; length=28
      illegalutf8test$ /space/jdk1.4.2-beta-b10/bin/java Test
      OK; length=28
      illegalutf8test$ /space/jdk1.4.2-beta-b10/bin/javac Test.java
      illegalutf8test$ /space/jdk1.3.1_03/bin/java Test
      Exception in thread "main" java.lang.NoSuchMethodError
      at Test.main(Test.java:6)
      illegalutf8test$ /space/jdk1.4.1_01/bin/java Test
      OK; length=28
      illegalutf8test$ /space/jdk1.4.2-beta-b10/bin/java Test
      OK; length=28
      illegalutf8test$ /space/jdk1.3.1_03/bin/java -version
      java version "1.3.1_03"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1_03-b03)
      Java HotSpot(TM) Client VM (build 1.3.1_03-b03, mixed mode)
      illegalutf8test$ /space/jdk1.4.1_01/bin/java -version
      java version "1.4.1_01"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
      Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)
      illegalutf8test$ /space/jdk1.4.2-beta-b10/bin/java -version
      java version "1.4.2-beta"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-beta-b10)
      Java HotSpot(TM) Client VM (build 1.4.2-beta-b10, mixed mode)
      illegalutf8test$


      Looks like some check in the VM was tightened up in 1.4.2 - unfortunately this can break older compiled code.


      To see in NetBeans, get a NetBeans development build, open an XML file, and right-click in the Editor and choose Validate XML. Under 1.4.1_01, it validates; under 1.4.2, a ClassFormatError is thrown from Xerces code. I do not know offhand what version of javac was used to compile this xerces2.jar; I think we got it in binary form from xml.apache.org.
      ###@###.### 2002-12-13

            foliversunw Fred Oliver (Inactive)
            jchalupa Jan Chalupa
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: