Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * fb-contrib - Auxiliary detectors for Java programs
   * Copyright (C) 2005-2015 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 java.util.Map;
 
 
 
looks for code that builds an array of values from a collection, by manually looping over the elements of the collection, and adding them to the array. It is simpler and cleaner to use mycollection.toArray(new type[mycollection.size()].
 
 public class UseToArray extends BytecodeScanningDetector 
 {
 	private OpcodeStack stack;
 	private Map<IntegerObjectuserValues;

constructs a UTA detector given the reporter to report bugs on

Parameters:
bugReporter the sync of bug reports
 
 	public UseToArray(BugReporter bugReporter) {
 		this. = bugReporter;
 		try {
 			 = Repository.lookupClass("java/util/Collection");
 		} catch (ClassNotFoundException cnfe) {
 			 = null;
 			 = cnfe;
 		}
 	}

implements the visitor to create and clear the stack, and report missing class errors

Parameters:
classContext the context object of the currently parsed class
 
 	public void visitClassContext(ClassContext classContext) {
 		if ( == null) {
 			if ( != null) {
 				 = null;
 			}
 			return;
 		}
 		
 		try {	
 			 = new OpcodeStack();
 			super.visitClassContext(classContext);
 		} finally {
 			 = null;
 		}
 	}

implements the visitor to reset the stack and uservalues

Parameters:
obj the context object of the currently parsed code block
 
 	public void visitCode(Code obj) {
 		try {
			super.visitCode(obj);
finally {
			 = null;
		}
	}

implements the visitor to look for manually copying of collections to arrays

Parameters:
seen the opcode of the currently parsed instruction
	public void sawOpcode(int seen) {
		int reg = -1;
		Object uValue = null;
		boolean sawAlias = false;
		boolean sawLoad = false;
		boolean sawNewArray = false;
		try {
	        .precomputation(this);
	        
			if (seen == ) {
				String methodName = getNameConstantOperand();
				String signature = getSigConstantOperand();
				if ("size".equals(methodName) && "()I".equals(signature)) {
					if (.getStackDepth() > 0) {
						reg = isLocalCollection(itm);
						if (reg >= 0) {
							sawAlias = true;
						}
					}
else if ("get".equals(methodName) && "(I)Ljava/lang/Object;".equals(signature)) {
					if (.getStackDepth() > 1) {
						reg = isLocalCollection(itm);
						if (reg >= 0) {
							sawAlias = true;
						}
					}
else if ("keySet".equals(methodName) || "values".equals(methodName) || "iterator".equals(methodName) || "next".equals(methodName)) {
					if (.getStackDepth() > 0) {
						reg = isLocalCollection(itm);
						if (reg >= 0) {
							sawAlias = true;
						}
					}
				}
else if (((seen == ) || ((seen >= ) && (seen <= )))
				   ||  ((seen == ) || ((seen >= ) && (seen <= )))) {
				if (.getStackDepth() > 0) {
					.put(Integer.valueOf(RegisterUtils.getStoreReg(thisseen)), uValue); 
				}
else if (((seen == ) || ((seen >= ) && (seen <= )))
				   ||  ((seen == ) || ((seen >= ) && (seen <= )))) {
				sawLoad = true;
else if (seen == ) {
				if (.getStackDepth() > 0) {
					uValue = itm.getUserValue();
					sawNewArray = true;
				}
else if (seen == ) {
				if (.getStackDepth() > 1) {
					reg = itm1.getRegisterNumber();
					if ((reg >= 0) && (itm1.couldBeZero())) {
						uValue = itm2.getUserValue();
						if (uValue != null) {
							.put(Integer.valueOf(reg), uValue);
						}
					}
				}
else if ((seen >= ) && (seen <= )) {
				if (.getStackDepth() > 2) {
					reg = isLocalCollection(arItem);
					if ((reg >= 0)
					&&  (idxItem.getUserValue() != null)
					&&  (valueItem.getUserValue() != null)) {
									.addClass(this)
									.addMethod(this)
					}
				}
else if (seen == ) {
				if (.getStackDepth() > 0) {
					uValue = itm.getUserValue();
					if (uValue instanceof Integer) {
						reg = ((Integer)uValue).intValue();
						sawAlias = true;
					}
				}
			}
catch (ClassNotFoundException cnfe) {
finally {
			TernaryPatcher.pre(seen);
			.sawOpcode(thisseen);
			TernaryPatcher.post(seen);
			if (sawAlias) {
				if (.getStackDepth() > 0) {
					itm.setUserValue(Integer.valueOf(reg));
				}
else if (sawLoad) {
				if (.getStackDepth() > 0) {
					reg = itm.getRegisterNumber();
					if (reg >= 0) {
						uValue = .get(Integer.valueOf(reg));
						itm.setUserValue(uValue);
					}
				}
else if (sawNewArray) {
				if (.getStackDepth() > 0) {
					itm.setUserValue(uValue);
				}
			}
		}
	}

determines if the stack item refers to a collection that is stored in a local variable param item the stack item to check

Returns:
the register number of the local variable that this collection refers to, or -1
Throws:
java.lang.ClassNotFoundException if the items class cannot be found
		Integer aliasReg = (Integer)item.getUserValue();
		if (aliasReg != null)
			return aliasReg.intValue();
		int reg = item.getRegisterNumber();
		if (reg < 0)
			return -1;
		JavaClass cls = item.getJavaClass();
		if ((cls != null) && cls.implementationOf())
			return reg;
		return -1;
	}
New to GrepCode? Check out our FAQ X