Class Pass3aVerifier

java.lang.Object
org.apache.bcel.verifier.PassVerifier
org.apache.bcel.verifier.statics.Pass3aVerifier

public final class Pass3aVerifier extends PassVerifier
This PassVerifier verifies a class file according to pass 3, static part as described in The Java Virtual Machine Specification, 2nd edition. More detailed information is to be found at the do_verify() method's documentation.
See Also:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    private final class 
    This visitor class does the actual checking for the instruction operand's constraints.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private Code
    The one and only Code object used by an instance of this class.
    The one and only InstructionList object used by an instance of this class.
    private final int
    The method number to verify.
    private final Verifier
    The Verifier that created this.
  • Constructor Summary

    Constructors
    Constructor
    Description
    Pass3aVerifier(Verifier verifier, int methodNo)
    Should only be instantiated by a Verifier.
  • Method Summary

    Modifier and Type
    Method
    Description
    private static boolean
    contains(int[] ints, int i)
    A small utility method returning if a given int i is in the given int[] ints.
    private void
    These are the checks that could be done in pass 2 but are delayed to pass 3 for performance reasons.
    Pass 3a is the verification of static constraints of JVM code (such as legal targets of branch instructions).
    int
    Returns the method number as supplied when instantiating.
    private void
    These are the checks if constraints are satisfied which are described in the Java Virtual Machine Specification, Second Edition as Static Constraints on the instructions of Java Virtual Machine Code (chapter 4.8.1).
    private void
    These are the checks for the satisfaction of constraints which are described in the Java Virtual Machine Specification, Second Edition as Static Constraints on the operands of instructions of Java Virtual Machine Code (chapter 4.8.1).
    protected String
    This method is a slightly modified version of verifier.statics.StringRepresentation.toString(final Node obj) that accepts any Object, not just a Node.

    Methods inherited from class org.apache.bcel.verifier.PassVerifier

    addMessage, getMessages, getMessagesList, verify

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • verifier

      private final Verifier verifier
      The Verifier that created this.
    • methodNo

      private final int methodNo
      The method number to verify. This is the index in the array returned by JavaClass.getMethods().
    • instructionList

      private InstructionList instructionList
      The one and only InstructionList object used by an instance of this class. It's here for performance reasons by do_verify() and its callees.
    • code

      private Code code
      The one and only Code object used by an instance of this class. It's here for performance reasons by do_verify() and its callees.
  • Constructor Details

    • Pass3aVerifier

      public Pass3aVerifier(Verifier verifier, int methodNo)
      Should only be instantiated by a Verifier.
  • Method Details

    • contains

      private static boolean contains(int[] ints, int i)
      A small utility method returning if a given int i is in the given int[] ints.
    • delayedPass2Checks

      private void delayedPass2Checks()
      These are the checks that could be done in pass 2 but are delayed to pass 3 for performance reasons. Also, these checks need access to the code array of the Code attribute of a Method so it's okay to perform them here. Also see the description of the do_verify() method.
      Throws:
      ClassConstraintException - if the verification fails.
      See Also:
    • do_verify

      public VerificationResult do_verify()
      Pass 3a is the verification of static constraints of JVM code (such as legal targets of branch instructions). This is the part of pass 3 where you do not need data flow analysis. JustIce also delays the checks for a correct exception table of a Code attribute and correct line number entries in a LineNumberTable attribute of a Code attribute (which conceptually belong to pass 2) to this pass. Also, most of the check for valid local variable entries in a LocalVariableTable attribute of a Code attribute is delayed until this pass. All these checks need access to the code array of the Code attribute.
      Specified by:
      do_verify in class PassVerifier
      Returns:
      The VerificationResult
      Throws:
      InvalidMethodException - if the method to verify does not exist.
    • getMethodNo

      public int getMethodNo()
      Returns the method number as supplied when instantiating.
    • pass3StaticInstructionChecks

      private void pass3StaticInstructionChecks()
      These are the checks if constraints are satisfied which are described in the Java Virtual Machine Specification, Second Edition as Static Constraints on the instructions of Java Virtual Machine Code (chapter 4.8.1).
      Throws:
      StaticCodeConstraintException - if the verification fails.
    • pass3StaticInstructionOperandsChecks

      private void pass3StaticInstructionOperandsChecks()
      These are the checks for the satisfaction of constraints which are described in the Java Virtual Machine Specification, Second Edition as Static Constraints on the operands of instructions of Java Virtual Machine Code (chapter 4.8.1). BCEL parses the code array to create an InstructionList and therefore has to check some of these constraints. Additional checks are also implemented here.
      Throws:
      StaticCodeConstraintException - if the verification fails.
    • tostring

      protected String tostring(Object obj)
      This method is a slightly modified version of verifier.statics.StringRepresentation.toString(final Node obj) that accepts any Object, not just a Node. Returns the String representation of the Object obj; this is obj.toString() if it does not throw any RuntimeException, or else it is a string derived only from obj's class name.