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.List;
 
 
 
looks for complex if conditions where multiple or clauses are joined together where the same variable is compared against a number of static values. This pattern is much more easy to read if you put those values in a static set, and just use one contains(value) call. The set name adds self-documentation as well.
 
 
 	private static final int LOW_CONDITIONAL_COUNT = 3;
 	private static final int NORMAL_CONDITIONAL_COUNT = 4;
 	private static final int HIGH_CONDITIONAL_COUNT = 6;
 	
 	private enum State {SAW_NOTHING, SAW_LOAD, SAW_CONST, SAW_EQUALS, SAW_PATTERN };
 	private OpcodeStack stack;
 	private List<IntegerswitchLocs;
 	private State state;
 	private int loadType;
 	private String constType;
 	private int conditionCount;
 	private int bugPC;

constructs a CBC detector given the reporter to report bugs on

Parameters:
reporter the sync of bug reports
 	
 	public ContainsBasedConditional(BugReporter reporter) {
 		 = reporter;
 	}
 	
 	public void visitClassContext(ClassContext classContext) {
 		try {
 			 = new OpcodeStack();
 			super.visitClassContext(classContext);
 		} finally {
 			 = null;
 			 = null;
 		}
 	}
 	
 	public void visitCode(Code obj) {
 		 = 0;
 		 = null;
 		 = 0;
 		super.visitCode(obj);
 	}
 	
 	public void sawOpcode(int seen) {
 		try {
 			
 			if ((seen == ) || (seen == )) {
 				.add(Integer.valueOf(getPC()));
 				for (int offset : getSwitchOffsets()) {
					.add(Integer.valueOf(getPC() + offset));
				}
			}
			if (!.isEmpty() && (getPC() == .get(0).intValue())) {
				return;
			}
			switch () {
				//$FALL-THROUGH$
					if (isLoad(seen)) {
						if ( > 0) {
							if ( == seen) {
else {
							}
else {
							 = seen;
							 = getPC();
						}
else {
										.addClass(this)
										.addMethod(this)
						}
					}
				break;
				case :
					if ((seen == ) || (seen == )) {
						String currConstType = null;
						if (c instanceof ConstantString) {
							currConstType = "java/lang/String";
else if (c instanceof ConstantClass) {
							currConstType = "java/lang/Class";
						}
						if ( > 0) {
							if (( != null) && .equals(currConstType)) {
else {
							}
else if (currConstType != null) {
							 = currConstType;
else {
						}
else if (seen == ) {
else if ((seen >= ) && (seen <= )) {
else if ((seen >= ) && (seen <= )) {
else {
					}
				break;
				case :
					if ((seen == ) && "equals".equals(getNameConstantOperand()) && "(Ljava/lang/Object;)Z".equals(getSigConstantOperand())) {
else if (seen == ) {
else if (seen == ) {
										.addClass(this)
										.addMethod(this)
						}
else {
					}
				break;
					if (seen == ) {
else if (seen == ) {
										.addClass(this)
										.addMethod(this)
						}
else {
					}
				break;
			}
finally {
			.sawOpcode(thisseen);
		}
	}
	private static boolean isLoad(int seen) {
		return OpcodeUtils.isALoad(seen) || OpcodeUtils.isILoad(seen) || OpcodeUtils.isLLoad(seen);
	}
	private static int priority(int conditionCount) {
		return (conditionCount < ) ?  : (conditionCount < ) ?  : ;
	}
New to GrepCode? Check out our FAQ X