package org.aspectj.apache.bcel.verifier; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache BCEL" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * "Apache BCEL", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import org.aspectj.apache.bcel.classfile.JavaClass; import org.aspectj.apache.bcel.verifier.statics.Pass1Verifier; import org.aspectj.apache.bcel.verifier.statics.Pass2Verifier; import org.aspectj.apache.bcel.verifier.statics.Pass3aVerifier; import org.aspectj.apache.bcel.verifier.structurals.Pass3bVerifier; /** * A Verifier instance is there to verify a class file according to The Java Virtual * Machine Specification, 2nd Edition. * * Pass-3b-verification includes pass-3a-verification; * pass-3a-verification includes pass-2-verification; * pass-2-verification includes pass-1-verification. * * A Verifier creates PassVerifier instances to perform the actual verification. * Verifier instances are usually generated by the VerifierFactory. * * @version $Id: Verifier.java,v 1.3 2009/09/09 19:56:20 aclement Exp $ * @author Enver Haase * @see org.aspectj.apache.bcel.verifier.VerifierFactory * @see org.aspectj.apache.bcel.verifier.PassVerifier */ public class Verifier{ /** * The name of the class this verifier operates on. */ private final String classname; /** A Pass1Verifier for this Verifier instance. */ private Pass1Verifier p1v; /** A Pass2Verifier for this Verifier instance. */ private Pass2Verifier p2v; /** The Pass3aVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ private HashMap p3avs = new HashMap(); /** The Pass3bVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ private HashMap p3bvs = new HashMap(); /** Returns the VerificationResult for the given pass. */ public VerificationResult doPass1(){ if (p1v == null){ p1v = new Pass1Verifier(this); } return p1v.verify(); } /** Returns the VerificationResult for the given pass. */ public VerificationResult doPass2(){ if (p2v == null){ p2v = new Pass2Verifier(this); } return p2v.verify(); } /** Returns the VerificationResult for the given pass. */ public VerificationResult doPass3a(int method_no){ String key = Integer.toString(method_no); Pass3aVerifier p3av; p3av = (p3avs.get(key)); if (p3avs.get(key) == null){ p3av = new Pass3aVerifier(this, method_no); p3avs.put(key, p3av); } return p3av.verify(); } /** Returns the VerificationResult for the given pass. */ public VerificationResult doPass3b(int method_no){ String key = Integer.toString(method_no); Pass3bVerifier p3bv; p3bv = (p3bvs.get(key)); if (p3bvs.get(key) == null){ p3bv = new Pass3bVerifier(this, method_no); p3bvs.put(key, p3bv); } return p3bv.verify(); } /** * Instantiation is done by the VerifierFactory. * * @see VerifierFactory */ Verifier(String fully_qualified_classname){ classname = fully_qualified_classname; flush(); } /** * Returns the name of the class this verifier operates on. * This is particularly interesting when this verifier was created * recursively by another Verifier and you got a reference to this * Verifier by the getVerifiers() method of the VerifierFactory. * @see VerifierFactory */ public final String getClassName(){ return classname; } /** * Forget everything known about the class file; that means, really * start a new verification of a possibly different class file from * BCEL's repository. * */ public void flush(){ p1v = null; p2v = null; p3avs.clear(); p3bvs.clear(); } /** * This returns all the (warning) messages collected during verification. * A prefix shows from which verifying pass a message originates. */ public String[] getMessages(){ ArrayList messages = new ArrayList(); if (p1v != null){ String[] p1m = p1v.getMessages(); for (int i=0; i p3as = p3avs.values().iterator(); while (p3as.hasNext()){ Pass3aVerifier pv = p3as.next(); String[] p3am = pv.getMessages(); int meth = pv.getMethodNo(); for (int i=0; i p3bs = p3bvs.values().iterator(); while (p3bs.hasNext()){ Pass3bVerifier pv = p3bs.next(); String[] p3bm = pv.getMessages(); int meth = pv.getMethodNo(); for (int i=0; i\n\n"); for(int k=0; k < args.length; k++) { if (args[k].endsWith(".class")){ int dotclasspos = args[k].lastIndexOf(".class"); if (dotclasspos != -1) args[k] = args[k].substring(0,dotclasspos); } args[k] = args[k].replace('/', '.'); System.out.println("Now verifying: "+args[k]+"\n"); Verifier v = VerifierFactory.getVerifier(args[k]); VerificationResult vr; vr = v.doPass1(); System.out.println("Pass 1:\n"+vr); vr = v.doPass2(); System.out.println("Pass 2:\n"+vr); if (vr == VerificationResult.VR_OK){ JavaClass jc = org.aspectj.apache.bcel.Repository .lookupClass(args[k]); for (int i=0; i"); for (int j=0; j