Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * fb-contrib - Auxiliary detectors for Java programs
   * Copyright (C) 2005-2013 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.classfile.Code;
 import  org.apache.bcel.classfile.Method;
 
 import  edu.umd.cs.findbugs.BugInstance;
 import  edu.umd.cs.findbugs.BugReporter;
 import  edu.umd.cs.findbugs.BytecodeScanningDetector;

looks for methods that copy data from one array to another using a loop. It is better performing to use System.arraycopy to do such copying as this is a native method.
 
 public class ManualArrayCopy extends BytecodeScanningDetector
 {
 	enum State {SAW_NOTHING, SAW_ICMP, SAW_ARRAY1_LOAD, SAW_ARRAY1_INDEX, SAW_ARRAY2_LOAD, SAW_ARRAY2_INDEX, SAW_ELEM_LOAD, SAW_ELEM_STORE}
 	private static final BitSet arrayLoadOps = new BitSet();
 	static {
 		.set(AALOAD);
 		.set(BALOAD);
 		.set(CALOAD);
 		.set(SALOAD);
 		.set(IALOAD);
 		.set(LALOAD);
 		.set(DALOAD);
 		.set(FALOAD);
 	}
 	private BugReporter bugReporter;
 	private State state;
 	private int arrayIndexReg;
 	private int loadInstruction;

constructs a MAC detector given the reporter to report bugs on

Parameters:
bugReporter the sync of bug reports
 
 	public ManualArrayCopy(BugReporter bugReporter) {
 		this. = bugReporter;
 	}

looks for methods that contain array load opcodes

Parameters:
method the context object of the current method
Returns:
if the class loads array contents
 
 	public boolean prescreen(Method method) {
 		BitSet bytecodeSet = getClassContext().getBytecodeSet(method);
 		return (bytecodeSet != null) && bytecodeSet.intersects();
 	}

implements the visitor to reset the state

Parameters:
obj the context object of the currently parsed code block
 
 	public void visitCode(Code obj) {
 		if (prescreen(getMethod())) {
 			super.visitCode(obj);
 		}
 	}
 	
 	public void sawOpcode(int seen) {
 		switch () {
 		    case :
 		    	if ((seen == IF_ICMPGE) || (seen == IF_ICMPGT))
 		    		 = .;
 		    break;
 		    
 			case :
 				if ((seen == ALOAD) || ((seen >= ALOAD_0) && (seen <= ALOAD_3)))
 			break;
 			
 				if (seen == ILOAD) {
else if ((seen >= ILOAD_0) && (seen <= ILOAD_3)) {
					 = seen - ILOAD_0;
else
			break;
				if ((seen == ALOAD) || ((seen >= ALOAD_0) && (seen <= ALOAD_3)))
				else
			break;
				if (seen == ILOAD) {
					else
else if ((seen >= ILOAD_0) && (seen <= ILOAD_3)) {
					if ( == (seen - ILOAD_0))
					else
else
			break;
				if ((seen == AALOAD) 
				||  (seen == BALOAD) 
				||  (seen == CALOAD) 
				||  (seen == SALOAD)
				||  (seen == IALOAD)
				||  (seen == LALOAD)
				||  (seen == DALOAD)
				||  (seen == FALOAD)) {
				}
				else
			break;
				if ((seen == AASTORE) 
				||  (seen == BASTORE) 
				||  (seen == CASTORE) 
				||  (seen == SASTORE)
				||  (seen == IASTORE)
				||  (seen == LASTORE)
				||  (seen == DASTORE)
				||  (seen == FASTORE)) {
else {
					}
else {
				}
			break;
				if (seen == IINC) {
					.reportBug( new BugInstance( this"MAC_MANUAL_ARRAY_COPY", NORMAL_PRIORITY)
						.addClass(this)
						.addMethod(this)
						.addSourceLine(this));
				}
			break;
		}
	}
	private boolean similarArrayInstructions(int loadint store) {
		if ((load == AALOAD) && (store == AASTORE))
			return true;
		if ((load == IALOAD) && (store == IASTORE))
			return true;
		if ((load == DALOAD) && (store == DASTORE))
			return true;
		if ((load == LALOAD) && (store == LASTORE))
			return true;
		if ((load == FALOAD) && (store == FASTORE))
			return true;
		if ((load == BALOAD) && (store == BASTORE))
			return true;
		if ((load == CALOAD) && (store == CASTORE))
			return true;
		if ((load == SALOAD) && (store == SASTORE))
			return true;
		return false;
	}
New to GrepCode? Check out our FAQ X