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 java.util.Map;
 
 import  org.apache.bcel.Constants;
 import  org.apache.bcel.classfile.Code;
 import  org.apache.bcel.classfile.Method;
 
 
looks for private methods that can only return one constant value. either the class should not return a value, or perhaps a branch was missed.
 
 public class MethodReturnsConstant extends BytecodeScanningDetector
 {
 	private final BugReporter bugReporter;
 	private OpcodeStack stack;
 	private int returnRegister;
 	private Object returnConstant;
 	private boolean methodSuspect;
 	private int returnPC;

constructs a MRC detector given the reporter to report bugs on

Parameters:
bugReporter the sync of bug reports
 
 	public MethodReturnsConstant(BugReporter bugReporter) {
 		this. = bugReporter;
 	}
 
 	public void visitClassContext(ClassContext classContext) {
 		try {
 			 = new OpcodeStack();
 			super.visitClassContext(classContext);
 		} finally {
 			 = null;
 			 = null;
 		}
 	}

implements the visitor to reset the stack and proceed for private methods

Parameters:
obj the context object of the currently parsed code block
 
 	public void visitCode(Code obj) {
 		Method m = getMethod();
 		int aFlags = m.getAccessFlags();
 		if ((((aFlags & Constants.ACC_PRIVATE) != 0) || ((aFlags & Constants.ACC_STATIC) != 0))
 		&&  ((aFlags & Constants.ACC_SYNTHETIC) == 0)
 		&&  (!m.getSignature().endsWith(")Z"))) {
 			 = -1;
 			 = null;
 			 = true;
 			 = -1;
 			super.visitCode(obj);
 			if ( && ( != null)) {
 				BugInstance bi = new BugInstance(this"MRC_METHOD_RETURNS_CONSTANT", ((aFlags & Constants.ACC_PRIVATE) != 0) ? NORMAL_PRIORITY : LOW_PRIORITY)
 									.addClass(this)
 									.addMethod(this);
 				if ( >= 0) {
 					bi.addSourceLine(this);
 				}
 
			}
		}
	}

implements the visitor to look for methods that return a constant

Parameters:
seen the opcode of the currently parsed instruction
	public void sawOpcode(int seen) {
		boolean sawSBToString = false;
		try {
			if (!) {
				return;
			}
	        .precomputation(this);
			if ((seen >= IRETURN) && (seen <= ARETURN)) {
				if (.getStackDepth() > 0) {
					int register = item.getRegisterNumber();
					if (.containsKey(register) && (.get(register) == null)) {
                         = false;
                        return;
                    }
					Object constant = item.getConstant();
					if (constant == null) {
						 = false;
						return;
					}
					if (..equals(item.getUserValue()) && ("".equals(constant))) {
						 = false;
						return;
					}
					if (( != null) && (!.equals(constant))) {
						 = false;
						return;
					}
					 = constant;
				}
else if ((seen == GOTO) || (seen == GOTO_W)) {
				if (.getStackDepth() > 0) {
					 = false//Trinaries confuse us too much, if the code has a ternary well - oh well
				}
else if (seen == INVOKEVIRTUAL) {
				if (clsName.startsWith("java/lang/StringB")) {
					sawSBToString = "toString".equals(getNameConstantOperand());
				}
else if ((seen >= ISTORE) && (seen <= ASTORE_3) || (seen == IINC)) {
			    int register = getRegisterOperand();
			    if (( != -1) && (register == )) {
			         = false;
			    }
			    if (.getStackDepth() > 0) {
			        OpcodeStack.Item item = .getStackItem(0);
			        Object constant = item.getConstant();
			        if (.containsKey(register)) {
			            if ((constant == null) || !constant.equals(.get(register))) {
			                .put(registernull);
			            }
			        } else {
			            .put(registerconstant);
			        }
			    } else {
			        .put(registernull);
			    }
			    if ( == register) {
			        Object constant = .get();
			        if (constant != null) {
			             = false;
			        }
			    }
			}
finally {
			TernaryPatcher.pre(seen);
			.sawOpcode(thisseen);
			TernaryPatcher.post(seen);
			if (sawSBToString && (.getStackDepth() > 0)) {
			}
		}
	}
New to GrepCode? Check out our FAQ X