You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bcel-dev@jakarta.apache.org by en...@apache.org on 2002/04/27 00:35:41 UTC
cvs commit: jakarta-bcel/src/java/org/apache/bcel/verifier/statics Pass3aVerifier.java
enver 02/04/26 15:35:41
Modified: src/java/org/apache/bcel/verifier/statics
Pass3aVerifier.java
Log:
Add checks for missing or wrongly-typed referenced fields.
Revision Changes Path
1.2 +32 -2 jakarta-bcel/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
Index: Pass3aVerifier.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Pass3aVerifier.java 29 Oct 2001 20:00:37 -0000 1.1
+++ Pass3aVerifier.java 26 Apr 2002 22:35:40 -0000 1.2
@@ -69,7 +69,7 @@
* More detailed information is to be found at the do_verify()
* method's documentation.
*
- * @version $Id: Pass3aVerifier.java,v 1.1 2001/10/29 20:00:37 jvanzyl Exp $
+ * @version $Id: Pass3aVerifier.java,v 1.2 2002/04/26 22:35:40 enver Exp $
* @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
* @see #do_verify()
*/
@@ -290,7 +290,7 @@
// The last byte of the last instruction in the code array must be the byte at index
// code_length-1 : See the do_verify() comments. We actually don't iterate through the
// byte array, but use an InstructionList so we cannot check for this. But BCEL does
- // things right, so it's implicitely okay.
+ // things right, so it's implicitly okay.
// TODO: Check how BCEL handles (and will handle) instructions like IMPDEP1, IMPDEP2,
// BREAKPOINT... that BCEL knows about but which are illegal anyway.
@@ -482,6 +482,36 @@
Constant c = cpg.getConstant(o.getIndex());
if (! (c instanceof ConstantFieldref)){
constraintViolated(o, "Indexing a constant that's not a CONSTANT_Fieldref but a '"+c+"'.");
+ }
+
+ String field_name = o.getFieldName(cpg);
+
+ JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName());
+ Field[] fields = jc.getFields();
+ Field f = null;
+ for (int i=0; i<fields.length; i++){
+ if (fields[i].getName().equals(field_name)){
+ f = fields[i];
+ break;
+ }
+ }
+ if (f == null){
+ /* TODO: also look up if the field is inherited! */
+ constraintViolated(o, "Referenced field '"+field_name+"' does not exist in class '"+jc.getClassName()+"'.");
+ }
+ else{
+ /* TODO: Check if assignment compatibility is sufficient.
+ What does Sun do? */
+ Type f_type = Type.getType(f.getSignature());
+ Type o_type = o.getType(cpg);
+
+ /* TODO: Is there a way to make BCEL tell us if a field
+ has a void method's signature, i.e. "()I" instead of "I"? */
+
+ if (! f_type.equals(o_type)){
+ constraintViolated(o, "Referenced field '"+field_name+"' has type '"+f_type+"' instead of '"+o_type+"' as expected.");
+ }
+ /* TODO: Check for access modifiers here. */
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>