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

Java Bytecode Verification impossible [2]

    XMLWordPrintable

Details

    • mantis
    • generic, x86
    • generic, solaris_7, windows_2000
    • Verified

    Description



      Name: skT45625 Date: 10/23/2000


      java version "1.3.0"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
      Java HotSpot(TM) Client VM (build 1.3.0, mixed mode)


      The following legal Java program is rejected by any Java Bytecode
      verifier I have tried. The program shows that Java Bytecode Verification
      is not possible as described in the Java Virtual Machine Specification.

      Remark: The example program shows a different problem than in my
      previous bug report. There are no "break" statements and labels involved
      in this program.

      public class Test {
        int test(boolean b) {
          int i;
          try {
            if (b) return 1;
            i = 2;
          } finally {
            if (b) i = 3;
          }
          return i;
        }
      }

      tomis> java -version
      java version "1.3.0"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
      Java HotSpot(TM) Client VM (build 1.3.0, mixed mode)
      tomis> javac Test.java
      tomis> java Test
      Exception in thread "main" java.lang.VerifyError: (class: Test, method: test
      signature: (Z)I) Register 2 contains wrong type

      What is the problem? The variable i is modified by the subroutine S
      corresponding to the finally block. The variable i, however, is
      "unusable" at the end of S, since S is called before the "return 1" and
      after the try block. When S is called before the "return 1" variable i
      is "unusable" and it remains "unusable", since there is a path from the
      beginning to the end of S which does not have an "istore i"
      instruction. Hence, at the of the try block, the variable "i" is
      unusable in the eyes of the bytecode verifier and therefore also at the
      end of the method at the "return i" instruction.

      Solution? Restrict the "rules of definite assignment" in the JLS for
      16.2.14 "try statement" such that the above program is no longer legal.

       
      http://java.sun.com/docs/books/jls/second_edition/html/defAssign.doc.html#26242

        V is definitely assigned after the try statement iff the following
        is true:
           V is definitely assigned after the finally block.
      (Review ID: 111235)
      ======================================================================

      Attachments

        Activity

          People

            gafter Neal Gafter
            skondamasunw Suresh Kondamareddy (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: