org.apache.bcel.verifier.statics
Class Pass2Verifier

java.lang.Object
  extended by org.apache.bcel.verifier.PassVerifier
      extended by org.apache.bcel.verifier.statics.Pass2Verifier
All Implemented Interfaces:
Constants

public final class Pass2Verifier
extends PassVerifier
implements Constants

This PassVerifier verifies a class file according to pass 2 as described in The Java Virtual Machine Specification, 2nd edition. More detailed information is to be found at the do_verify() method's documentation.

Version:
$Id: Pass2Verifier.java 386056 2006-03-15 11:31:56Z tcurdt $
Author:
Enver Haase
See Also:
do_verify()

Nested Class Summary
private  class Pass2Verifier.CPESSC_Visitor
          A Visitor class that ensures the constant pool satisfies the static constraints.
private  class Pass2Verifier.FAMRAV_Visitor
          A Visitor class that ensures the ConstantCP-subclassed entries of the constant pool are valid.
private static class Pass2Verifier.InnerClassDetector
          This class serves for finding out if a given JavaClass' ConstantPool references an Inner Class.
 
Field Summary
private  LocalVariablesInfo[] localVariablesInfos
          The LocalVariableInfo instances used by Pass3bVerifier.
private  Verifier myOwner
          The Verifier that created this.
 
Fields inherited from interface org.apache.bcel.Constants
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACCESS_NAMES, ACONST_NULL, ALOAD, ALOAD_0, ALOAD_1, ALOAD_2, ALOAD_3, ANEWARRAY, ANEWARRAY_QUICK, ARETURN, ARRAYLENGTH, ASTORE, ASTORE_0, ASTORE_1, ASTORE_2, ASTORE_3, ATHROW, ATTR_ANNOTATION_DEFAULT, ATTR_CODE, ATTR_CONSTANT_VALUE, ATTR_DEPRECATED, ATTR_EXCEPTIONS, ATTR_INNER_CLASSES, ATTR_LINE_NUMBER_TABLE, ATTR_LOCAL_VARIABLE_TABLE, ATTR_PMG, ATTR_RUNTIMEINVISIBLE_ANNOTATIONS, ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS, ATTR_RUNTIMEVISIBLE_ANNOTATIONS, ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS, ATTR_SIGNATURE, ATTR_SOURCE_FILE, ATTR_STACK_MAP, ATTR_SYNTHETIC, ATTR_UNKNOWN, ATTRIBUTE_NAMES, BALOAD, BASTORE, BIPUSH, BREAKPOINT, CALOAD, CASTORE, CHECKCAST, CHECKCAST_QUICK, CLASS_TYPE_NAMES, CONSTANT_Class, CONSTANT_Double, CONSTANT_Fieldref, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodref, CONSTANT_Long, CONSTANT_Methodref, CONSTANT_NameAndType, CONSTANT_NAMES, CONSTANT_String, CONSTANT_Utf8, CONSTRUCTOR_NAME, CONSUME_STACK, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DLOAD_0, DLOAD_1, DLOAD_2, DLOAD_3, DMUL, DNEG, DREM, DRETURN, DSTORE, DSTORE_0, DSTORE_1, DSTORE_2, DSTORE_3, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAD_0, FLOAD_1, FLOAD_2, FLOAD_3, FMUL, FNEG, FREM, FRETURN, FSTORE, FSTORE_0, FSTORE_1, FSTORE_2, FSTORE_3, FSUB, GETFIELD, GETFIELD_QUICK, GETFIELD_QUICK_W, GETFIELD2_QUICK, GETSTATIC, GETSTATIC_QUICK, GETSTATIC2_QUICK, GOTO, GOTO_W, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILLEGAL_OPCODE, ILLEGAL_TYPE, ILOAD, ILOAD_0, ILOAD_1, ILOAD_2, ILOAD_3, IMPDEP1, IMPDEP2, IMUL, INEG, INSTANCEOF, INSTANCEOF_QUICK, INT2BYTE, INT2CHAR, INT2SHORT, INTERFACES_IMPLEMENTED_BY_ARRAYS, INVOKEINTERFACE, INVOKEINTERFACE_QUICK, INVOKENONVIRTUAL, INVOKENONVIRTUAL_QUICK, INVOKESPECIAL, INVOKESTATIC, INVOKESTATIC_QUICK, INVOKESUPER_QUICK, INVOKEVIRTUAL, INVOKEVIRTUAL_QUICK, INVOKEVIRTUAL_QUICK_W, INVOKEVIRTUALOBJECT_QUICK, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISTORE_0, ISTORE_1, ISTORE_2, ISTORE_3, ISUB, ITEM_Bogus, ITEM_Double, ITEM_Float, ITEM_InitObject, ITEM_Integer, ITEM_Long, ITEM_NAMES, ITEM_NewObject, ITEM_Null, ITEM_Object, IUSHR, IXOR, JSR, JSR_W, KNOWN_ATTRIBUTES, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDC_QUICK, LDC_W, LDC_W_QUICK, LDC2_W, LDC2_W_QUICK, LDIV, LLOAD, LLOAD_0, LLOAD_1, LLOAD_2, LLOAD_3, LMUL, LNEG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSTORE_0, LSTORE_1, LSTORE_2, LSTORE_3, LSUB, LUSHR, LXOR, MAJOR, MAJOR_1_1, MAJOR_1_2, MAJOR_1_3, MAJOR_1_4, MAJOR_1_5, MAX_ACC_FLAG, MAX_BYTE, MAX_CODE_SIZE, MAX_CP_ENTRIES, MAX_SHORT, MINOR, MINOR_1_1, MINOR_1_2, MINOR_1_3, MINOR_1_4, MINOR_1_5, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, MULTIANEWARRAY_QUICK, NEW, NEW_QUICK, NEWARRAY, NO_OF_OPERANDS, NOP, OPCODE_NAMES, POP, POP2, PRODUCE_STACK, PUSH, PUTFIELD, PUTFIELD_QUICK, PUTFIELD_QUICK_W, PUTFIELD2_QUICK, PUTSTATIC, PUTSTATIC_QUICK, PUTSTATIC2_QUICK, RESERVED, RET, RETURN, SALOAD, SASTORE, SHORT_TYPE_NAMES, SIPUSH, STATIC_INITIALIZER_NAME, SWAP, SWITCH, T_ADDRESS, T_ARRAY, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_OBJECT, T_REFERENCE, T_SHORT, T_UNKNOWN, T_VOID, TABLESWITCH, TYPE_NAMES, TYPE_OF_OPERANDS, UNDEFINED, UNPREDICTABLE, WIDE
 
Constructor Summary
Pass2Verifier(Verifier owner)
          Should only be instantiated by a Verifier.
 
Method Summary
private  void constant_pool_entries_satisfy_static_constraints()
          Ensures that the constant pool entries satisfy the static constraints as described in The Java Virtual Machine Specification, 2nd Edition.
 VerificationResult do_verify()
          Pass 2 is the pass where static properties of the class file are checked without looking into "Code" arrays of methods.
private  void every_class_has_an_accessible_superclass()
          Ensures that every class has a super class and that final classes are not subclassed.
private  void field_and_method_refs_are_valid()
          Ensures that the ConstantCP-subclassed entries of the constant pool are valid.
private  void final_methods_are_not_overridden()
          Ensures that final methods are not overridden.
 LocalVariablesInfo getLocalVariablesInfo(int method_nr)
          Returns a LocalVariablesInfo object containing information about the usage of the local variables in the Code attribute of the said method or null if the class file this Pass2Verifier operates on could not be pass-2-verified correctly.
private static java.lang.String tostring(Node n)
          This method is here to save typing work and improve code readability.
private static boolean validClassMethodName(java.lang.String name)
          This method returns true if and only if the supplied String represents a valid method name that may be referenced by ConstantMethodref objects.
private static boolean validClassName(java.lang.String name)
          This method returns true if and only if the supplied String represents a valid Java class name.
private static boolean validFieldName(java.lang.String name)
          This method returns true if and only if the supplied String represents a valid Java field name.
private static boolean validInterfaceMethodName(java.lang.String name)
          This method returns true if and only if the supplied String represents a valid Java interface method name that may be referenced by ConstantInterfaceMethodref objects.
private static boolean validJavaIdentifier(java.lang.String name)
          This method returns true if and only if the supplied String represents a valid Java identifier (so-called simple name).
private static boolean validJavaLangMethodName(java.lang.String name)
          This method returns true if and only if the supplied String represents a valid Java programming language method name stored as a simple (non-qualified) name.
private static boolean validMethodName(java.lang.String name, boolean allowStaticInit)
          This method returns true if and only if the supplied String represents a valid method name.
 
Methods inherited from class org.apache.bcel.verifier.PassVerifier
addMessage, getMessages, verify
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

localVariablesInfos

private LocalVariablesInfo[] localVariablesInfos
The LocalVariableInfo instances used by Pass3bVerifier. localVariablesInfos[i] denotes the information for the local variables of method number i in the JavaClass this verifier operates on.


myOwner

private Verifier myOwner
The Verifier that created this.

Constructor Detail

Pass2Verifier

public Pass2Verifier(Verifier owner)
Should only be instantiated by a Verifier.

See Also:
Verifier
Method Detail

getLocalVariablesInfo

public LocalVariablesInfo getLocalVariablesInfo(int method_nr)
Returns a LocalVariablesInfo object containing information about the usage of the local variables in the Code attribute of the said method or null if the class file this Pass2Verifier operates on could not be pass-2-verified correctly. The method number method_nr is the method you get using Repository.lookupClass(myOwner.getClassname()).getMethods()[method_nr];. You should not add own information. Leave that to JustIce.


do_verify

public VerificationResult do_verify()
Pass 2 is the pass where static properties of the class file are checked without looking into "Code" arrays of methods. This verification pass is usually invoked when a class is resolved; and it may be possible that this verification pass has to load in other classes such as superclasses or implemented interfaces. Therefore, Pass 1 is run on them.
Note that most referenced classes are not loaded in for verification or for an existance check by this pass; only the syntactical correctness of their names and descriptors (a.k.a. signatures) is checked.
Very few checks that conceptually belong here are delayed until pass 3a in JustIce. JustIce does not only check for syntactical correctness but also for semantical sanity - therefore it needs access to the "Code" array of methods in a few cases. Please see the pass 3a documentation, too.

Specified by:
do_verify in class PassVerifier
See Also:
Pass3aVerifier

every_class_has_an_accessible_superclass

private void every_class_has_an_accessible_superclass()
Ensures that every class has a super class and that final classes are not subclassed. This means, the class this Pass2Verifier operates on has proper super classes (transitively) up to java.lang.Object. The reason for really loading (and Pass1-verifying) all of those classes here is that we need them in Pass2 anyway to verify no final methods are overridden (that could be declared anywhere in the ancestor hierarchy).

Throws:
ClassConstraintException - otherwise.

final_methods_are_not_overridden

private void final_methods_are_not_overridden()
Ensures that final methods are not overridden. Precondition to run this method: constant_pool_entries_satisfy_static_constraints() and every_class_has_an_accessible_superclass() have to be invoked before (in that order).

Throws:
ClassConstraintException - otherwise.
See Also:
constant_pool_entries_satisfy_static_constraints(), every_class_has_an_accessible_superclass()

constant_pool_entries_satisfy_static_constraints

private void constant_pool_entries_satisfy_static_constraints()
Ensures that the constant pool entries satisfy the static constraints as described in The Java Virtual Machine Specification, 2nd Edition.

Throws:
ClassConstraintException - otherwise.

field_and_method_refs_are_valid

private void field_and_method_refs_are_valid()
Ensures that the ConstantCP-subclassed entries of the constant pool are valid. According to "Yellin: Low Level Security in Java", this method does not verify the existence of referenced entities (such as classes) but only the formal correctness (such as well-formed signatures). The visitXXX() methods throw ClassConstraintException instances otherwise. Precondition: index-style cross referencing in the constant pool must be valid. Simply invoke constant_pool_entries_satisfy_static_constraints() before.

Throws:
ClassConstraintException - otherwise.
See Also:
constant_pool_entries_satisfy_static_constraints()

validClassName

private static final boolean validClassName(java.lang.String name)
This method returns true if and only if the supplied String represents a valid Java class name.


validMethodName

private static boolean validMethodName(java.lang.String name,
                                       boolean allowStaticInit)
This method returns true if and only if the supplied String represents a valid method name. This is basically the same as a valid identifier name in the Java programming language, but the special name for the instance initialization method is allowed and the special name for the class/interface initialization method may be allowed.


validClassMethodName

private static boolean validClassMethodName(java.lang.String name)
This method returns true if and only if the supplied String represents a valid method name that may be referenced by ConstantMethodref objects.


validJavaLangMethodName

private static boolean validJavaLangMethodName(java.lang.String name)
This method returns true if and only if the supplied String represents a valid Java programming language method name stored as a simple (non-qualified) name. Conforming to: The Java Virtual Machine Specification, Second Edition, ?2.7, ?2.7.1, ?2.2.


validInterfaceMethodName

private static boolean validInterfaceMethodName(java.lang.String name)
This method returns true if and only if the supplied String represents a valid Java interface method name that may be referenced by ConstantInterfaceMethodref objects.


validJavaIdentifier

private static boolean validJavaIdentifier(java.lang.String name)
This method returns true if and only if the supplied String represents a valid Java identifier (so-called simple name).


validFieldName

private static boolean validFieldName(java.lang.String name)
This method returns true if and only if the supplied String represents a valid Java field name.


tostring

private static java.lang.String tostring(Node n)
This method is here to save typing work and improve code readability.