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;
 import java.util.Set;
 
 
looks for classes that maintain two or more lists or arrays associated one-for-one through the same index to hold two or more pieces of related information. It would be better to create a new class that holds all of these pieces of information, and place instances of this class in one list.
 
 public class ParallelLists extends BytecodeScanningDetector
 {
 	private OpcodeStack stack;
 	private Set<StringlistFields;
constructs a PL detector given the reporter to report bugs on

Parameters:
bugReporter the sync of bug reports
 
 	public ParallelLists(final BugReporter bugReporter) {
 		this. = bugReporter;
 	}
 	
 	public void visitClassContext(final ClassContext classContext) {
 		try {
 			JavaClass cls = classContext.getJavaClass();
 	
 			 = new HashSet<String>();
 			Field[] flds = cls.getFields();
 			for (Field f : flds) {
 				String sig = f.getSignature();
 				if (sig.charAt(0) == 'L') {
 					sig = sig.substring(1, sig.length() - 1);
 					if (sig.startsWith("java/util/") && sig.endsWith("List")) {
 					}
 				} else if ((sig.charAt(0) == '[') && (sig.charAt(1) != '['))
 			}
 			
 			if (.size() > 0) {
 				 = new OpcodeStack();
 				super.visitClassContext(classContext);
 			}
 		} finally {
 			 = null;
 			 = null;
 		}
 	}
 	
 	public void visitCode(final Code obj) {
 		super.visitCode(obj);
 	}
 	
 	public void sawOpcode(final int seen) {
 		try {
 	        .precomputation(this);
 			
 			if (seen == ) {
 				String className = getClassConstantOperand();
				String methodName = getNameConstantOperand();
				String methodSig = getSigConstantOperand();
				if ("java/util/List".equals(className
				&&  "get".equals(methodName)
				&&  "(I)Ljava/lang/Object;".equals(methodSig)) {
				}
else if ((seen >= ) && (seen <= )) {
else if ((seen == ) || (seen == ) || ((seen >= ) && (seen <= ))) {
				int reg = getIntOpRegister(seen);
else if ((seen >=  ) && (seen <= )) {
			}
finally {
			.sawOpcode(thisseen);
		}
	}
	private int getIntOpRegister(final int seen) {
		if ((seen == ) || (seen == ))
		return seen - ;
	}
	private void checkParms() {
		if (.getStackDepth() >= 2) {
			int indexReg = index.getRegisterNumber();
			XField field = list.getXField();
			if ((indexReg >= 0) && (field != null)) {
				if (.contains(field.getName())) {
					String f = .get(Integer.valueOf(indexReg));
					if ((f != null) && (!f.equals(field.getName()))) {
						.reportBugnew BugInstancethis"PL_PARALLEL_LISTS")
							.addClass(this)
							.addMethod(this)
							.addSourceLine(thisgetPC()));
					}
					else
						.put(Integer.valueOf(indexReg), field.getName());
				}
			}
		}
	}
New to GrepCode? Check out our FAQ X