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 java.util.Map;
 
 import  org.apache.bcel.Constants;
 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 pass a primitive wrapper class object, to the same classes Constructor.
 
 public class NeedlessAutoboxing extends BytecodeScanningDetector
 {
 	enum State {SEEN_NOTHING, SEEN_VALUE, SEEN_VALUEOFSTRING, SEEN_PARSE, SEEN_CTOR, SEEN_VALUEOFPRIMITIVE, SEEN_GOTO, SEEN_ICONST, SEEN_GETSTATIC}
 	
 	private static final Map<StringString[]> boxClasses = new HashMap<StringString[]>();
 	static {
 		.put("java/lang/Boolean"new String[] { "booleanValue()Z""(Z)V""(Z)Ljava/lang/Boolean;" });
 		.put("java/lang/Character"new String[] { "charValue()C""(C)V""(C)Ljava/lang/Character;" });
 		.put("java/lang/Byte"new String[] { "byteValue()B""(B)V""(B)Ljava/lang/Byte;" });
 		.put("java/lang/Short"new String[] { "shortValue()S""(S)V""(S)Ljava/lang/Short;" });
 		.put("java/lang/Integer"new String[] { "intValue()I""(I)V""(I)Ljava/lang/Integer;" });
 		.put("java/lang/Long"new String[] { "longValue()J""(J)V""(J)Ljava/lang/Long;" });
 		.put("java/lang/Float"new String[] { "floatValue()F""(F)V""(F)Ljava/lang/Float;" });
 		.put("java/lang/Double"new String[] { "doubleValue()D""(D)V""(D)Ljava/lang/Double;" });
 	}
 	
 	private static final Map<StringStringparseClasses = new HashMap<StringString>();
 	static {
 		.put("java/lang/Boolean""parseBoolean(Ljava/lang/String;)Z");
 		.put("java/lang/Byte""parseByte(Ljava/lang/String;)B");
 		.put("java/lang/Short",  "parseShort(Ljava/lang/String;)S");
 		.put("java/lang/Integer""parseInt(Ljava/lang/String;)I");
 		.put("java/lang/Long""parseLong(Ljava/lang/String;)J");
 		.put("java/lang/Float""parseFloat(Ljava/lang/String;)F");
 		.put("java/lang/Double""parseDouble(Ljava/lang/String;)D");
 	}
 	
 	private BugReporter bugReporter;
 	private State state;
 	private String boxClass;

constructs a NAB detector given the reporter to report bugs on

Parameters:
bugReporter the sync of bug reports
 
 	public NeedlessAutoboxing(BugReporter bugReporter) {
 		this. = bugReporter;
 	}
 
 	public void visitMethod(Method obj) {
 	}
 	
 	public void sawOpcode(int seen) {
 		
 		switch () {
 			case :
 			case :
 				if (seen == INVOKEVIRTUAL) {
 					String[] boxSigs = .get();
 					if (boxSigs != null) {
 						if (boxSigs[0].equals(methodInfo)) {
 						}
 					}
 				} else if (seen == INVOKESTATIC) {
 					String[] boxSigs = .get();
 					if (boxSigs != null) {
 						if ("valueOf".equals(getNameConstantOperand())) {
							if (sig.startsWith("(Ljava/lang/String;)")) {
								if (!"java/lang/Boolean".equals() || (getClassContext().getJavaClass().getMajor() >= Constants.MAJOR_1_5))
else if (!sig.startsWith("(Ljava/lang/String;")) {
							}
else {
							if (parseSig != null) {
								if (parseSig.equals(methodInfo)) {
								}
							}
						}
					}
else if (seen == INVOKESPECIAL) {
					String[] boxSigs = .get();
					if (boxSigs != null) {
						if ("<init>".equals(getNameConstantOperand()) && boxSigs[1].equals(getSigConstantOperand())) {
						}
					}
else if ((seen == ICONST_0) || (seen == ICONST_1)) {
else if (seen == GETSTATIC) {
					if ("java/lang/Boolean".equals(clsName)) {
						if ("TRUE".equals(fldName) || "FALSE".equals(fldName))
					}
else if ((seen == GOTO) || (seen == GOTO_W)) {
				}
			break;
				if (seen == INVOKESPECIAL) {
						String methodName = getNameConstantOperand();
						String boxSig = .get()[1];
						if ("<init>".equals(methodName)) {
							String methodSig = getSigConstantOperand();
							if (boxSig.equals(methodSig)) {
								.reportBug(new BugInstance(this"NAB_NEEDLESS_AUTOBOXING_CTOR", NORMAL_PRIORITY)
									.addClass(this)
									.addMethod(this)
									.addSourceLine(this));
							}
						}
					}
else if (seen == INVOKESTATIC) {
						String methodName = getNameConstantOperand();
						String boxSig = .get()[2];
						if ("valueOf".equals(methodName)) {
							String methodSig = getSigConstantOperand();
							if (boxSig.equals(methodSig)) {
								.reportBug(new BugInstance(this"NAB_NEEDLESS_AUTOBOXING_VALUEOF", NORMAL_PRIORITY)
									.addClass(this)
									.addMethod(this)
									.addSourceLine(this));
							}
						}
					}
				}
			break;
			case :
				if (seen == INVOKEVIRTUAL) {
					String[] boxSigs = .get();
						.reportBug(new BugInstance(this"NAB_NEEDLESS_BOX_TO_UNBOX", NORMAL_PRIORITY)
								   .addClass(this)
								   .addMethod(this)
								   .addSourceLine(this));
else if (getSigConstantOperand().startsWith("()") && getNameConstantOperand().endsWith("Value")) {
						.reportBug(new BugInstance(this"NAB_NEEDLESS_BOX_TO_CAST", NORMAL_PRIORITY)
						   .addClass(this)
						   .addMethod(this)
						   .addSourceLine(this));
					}
				}
			break;			
				if (seen == INVOKEVIRTUAL) {
					String[] boxSigs = .get();
						.reportBug(new BugInstance(this"NAB_NEEDLESS_BOXING_PARSE", NORMAL_PRIORITY)
								   .addClass(this)
								   .addMethod(this)
								   .addSourceLine(this));
					}
				}
			break;
				if (seen == INVOKESTATIC) {
						if ("valueOf".equals(getNameConstantOperand())) {
							.reportBug(new BugInstance(this"NAB_NEEDLESS_BOXING_VALUEOF", NORMAL_PRIORITY)
									   .addClass(this)
									   .addMethod(this)
									   .addSourceLine(this));
						}
					}
else if (seen == INVOKESPECIAL) {
						.reportBug(new BugInstance(this"NAB_NEEDLESS_BOXING_STRING_CTOR", NORMAL_PRIORITY)
								   .addClass(this)
								   .addMethod(this)
								   .addSourceLine(this));
					}
				}
			break;
				if (seen == INVOKESTATIC) {
					if (("java/lang/Boolean".equals(getClassConstantOperand())
					&&  ("valueOf".equals(getNameConstantOperand())
					&&  ("(Z)Ljava/lang/Boolean;".equals(getSigConstantOperand()))))) {
						.reportBug(new BugInstance(this"NAB_NEEDLESS_BOOLEAN_CONSTANT_CONVERSION", NORMAL_PRIORITY)
									.addClass(this)
									.addMethod(this)
									.addSourceLine(this));
					}
				}
				sawOpcode(seen);
			break;
				if (seen == INVOKEVIRTUAL) {
					if (("java/lang/Boolean".equals(getClassConstantOperand())
					&&  ("booleanValue".equals(getNameConstantOperand())
					&&  ("()Z".equals(getSigConstantOperand()))))) {
						.reportBug(new BugInstance(this"NAB_NEEDLESS_BOOLEAN_CONSTANT_CONVERSION", NORMAL_PRIORITY)
									.addClass(this)
									.addMethod(this)
									.addSourceLine(this));
					}
				}
				sawOpcode(seen);
			break;
		}		
	}
New to GrepCode? Check out our FAQ X