Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * fb-contrib - Auxiliary detectors for Java programs
   * Copyright (C) 2005-2014 Dave Brosius
   * 
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   * 
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  * 
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 package com.mebigfatguy.fbcontrib.detect;
 
 import  org.apache.bcel.Constants;
 import  org.apache.bcel.classfile.JavaClass;
 import  org.apache.bcel.classfile.Method;
 import  org.apache.bcel.generic.Type;
 
 
 public class UseVarArgs extends PreorderVisitor implements Detector 
 {
 	private final BugReporter bugReporter;
 	private JavaClass javaClass;
 	
 	public UseVarArgs(BugReporter bugReporter) {
 		this. = bugReporter;
 	}
 	
 	public void visitClassContext(ClassContext classContext) {
 		try {
 			 = classContext.getJavaClass();
 			if (.getMajor() >= Constants.MAJOR_1_5) {
 				.accept(this);
 			}
 		} finally {
 			 = null;
 		}
 	}
 	
 	public void visitMethod(Method obj) {
 		try {
 			if (obj.isSynthetic()) {
 				return;
 			}
 			
 			Type[] types = obj.getArgumentTypes();
 			if ((types.length == 0) || (types.length > 2)) {
 				return;
 			}
 			
 			if ((obj.getAccessFlags() & Constants.ACC_VARARGS) != 0) {
 				return;
 			}
 			
 			String lastParmSig = types[types.length-1].getSignature();
 			if (!lastParmSig.startsWith("[") || lastParmSig.startsWith("[[")) {
 				return;
 			}
 			
 			if (hasSimilarParms(types)) {
 				return;
 			}
 			
 			if (obj.isStatic() && "main".equals(obj.getName()) && "([Ljava/lang/String;)V".equals(obj.getSignature())) {
 				return;
 			}
 	
 			if (!obj.isPrivate() && !obj.isStatic() && isInherited(obj)) {
 				return;
 			}
 			
 			super.visitMethod(obj);
 			.reportBug(new BugInstance(this"UVA_USE_VAR_ARGS")
 						.addClass(this)
 						.addMethod(this));
 			
 			
 		} catch (ClassNotFoundException cnfe) {
 		}
 	}
 	
 	public void report() {
 	}
 	
 	private boolean hasSimilarParms(Type[] argTypes) {
		for (int i = 0; i < argTypes.length - 1; i++) {
			if (argTypes[i].getSignature().startsWith("[")) {
				return true;
			}
		}
		String baseType = argTypes[argTypes.length-1].getSignature();
		while (baseType.startsWith("[")) {
			baseType = baseType.substring(1);
		}
		for (int i = 0; i < argTypes.length - 1; i++) {
			if (argTypes[i].getSignature().equals(baseType)) {
				return true;
			}
		}
		return false;
	}
	private boolean isInherited(Method mthrows ClassNotFoundException {
		JavaClass[] infs = .getAllInterfaces();
		for (JavaClass inf : infs) {
			if (hasMethod(infm))
				return true;
		}
		JavaClass[] sups = .getSuperClasses();
		for (JavaClass sup : sups) {
			if (hasMethod(supm))
				return true;
		}
		return false;
	}
	private boolean hasMethod(JavaClass c, Method candidateMethod) {
		String name = candidateMethod.getName();
		String sig = candidateMethod.getSignature();
		for (Method method : c.getMethods()) {
			if (!method.isStatic() && method.getName().equals(name) && method.getSignature().equals(sig)) {
				return true;
			}
		}
		return false;
	}
New to GrepCode? Check out our FAQ X