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.Set;
 
 import  org.apache.bcel.Constants;
 import  org.apache.bcel.classfile.Code;
 import  org.apache.bcel.classfile.CodeException;
 
 
 import  edu.umd.cs.findbugs.BugInstance;
 import  edu.umd.cs.findbugs.BugReporter;
 import  edu.umd.cs.findbugs.BytecodeScanningDetector;
 import  edu.umd.cs.findbugs.OpcodeStack;
 import  edu.umd.cs.findbugs.ba.ClassContext;

looks for construction of new objects, and then the immediate testing whether the object is null or not. As the new operator will always succeed, or through an exception, this test is unnecessary and represents a misunderstanding as to how the jvm works.
 
 public class UnnecessaryNewNullCheck extends BytecodeScanningDetector
 {
 	private final BugReporter bugReporter;
 	private OpcodeStack stack;
 
 	public UnnecessaryNewNullCheck(BugReporter bugReporter) {
 		this. = bugReporter;
 	}
 
 	public void visitClassContext(ClassContext classContext) {
 		try {
 			 = new OpcodeStack();
 			super.visitClassContext(classContext);
 		} finally {
 			 = null;
 			 = null;
 			 = null;
 		}
 	}
 
 	public void visitCode(Code obj) {
 		if (prescreen()) {
 			.resetForMethodEntry(this);
 
 			CodeException[] ce = obj.getExceptionTable();
 			if (ce != null) {
 				for (CodeException element : ce) {
 					.add(Integer.valueOf(element.getEndPC()));
 				}
 			}
 			super.visitCode(obj);
 		}
 	}
 
 	public void sawOpcode(int seen) {
 		boolean sawAlloc = false;
 		try {
 			{
 				int depth = .getStackDepth();
 				for (int i = 0; i < depthi++) {
 					OpcodeStack.Item item = .getStackItem(i);
 					item.setUserValue(null);
 				}
 			}
 
			switch (seen) {
			case NEW:
			case ANEWARRAY:
			case MULTIANEWARRAY:
				sawAlloc = true;
				break;
			case INVOKESPECIAL:
			    if ("<init>".equals(getNameConstantOperand())) {
			        sawAlloc = true;
			    }
			    break;
			case ASTORE:
			case ASTORE_0:
			case ASTORE_1:
			case ASTORE_2:
			case ASTORE_3:
				if (.getStackDepth() > 0) {
					OpcodeStack.Item item = .getStackItem(0);
					int reg = RegisterUtils.getAStoreReg(thisseen);
					if (item.getUserValue() != null) {
						.add(Integer.valueOf(reg));
else {
					}
				}
				break;
			case ALOAD:
			case ALOAD_0:
			case ALOAD_1:
			case ALOAD_2:
			case ALOAD_3:
				int reg = RegisterUtils.getALoadReg(thisseen);
				sawAlloc = (.contains(Integer.valueOf(reg)));
				break;
			case IFNONNULL:
			case IFNULL:
				if (.getStackDepth() > 0) {
					OpcodeStack.Item item = .getStackItem(0);
					if (item.getUserValue() != null) {
						if (AttributesUtils.isValidLineNumber(getCode(), getPC())) {
							.reportBug(new BugInstance(this"UNNC_UNNECESSARY_NEW_NULL_CHECK", NORMAL_PRIORITY)
							.addClass(this)
							.addMethod(this)
							.addSourceLine(this));
						}
					}
				}
				break;
			case IFEQ:
			case IFNE:
			case IFLT:
			case IFGE:
			case IFGT:
			case IFLE:
			case IF_ICMPEQ:
			case IF_ICMPNE:
			case IF_ICMPLT:
			case IF_ICMPGE:
			case IF_ICMPGT:
			case IF_ICMPLE:
			case IF_ACMPEQ:
			case IF_ACMPNE:
			case GOTO:
			case GOTO_W:
				break;
			case TABLESWITCH:
			case LOOKUPSWITCH:
			case IRETURN:
			case LRETURN:
			case FRETURN:
			case DRETURN:
			case ARETURN:
			case RETURN:
			case ATHROW:
				break;
			}
finally {
			TernaryPatcher.pre(seen);
			.sawOpcode(thisseen);
			TernaryPatcher.post(seen);
			if (.getStackDepth() > 0) {
				OpcodeStack.Item item = .getStackItem(0);
				item.setUserValue(sawAlloc ? . : null);
			}
		}
	}
	private boolean prescreen() {
		BitSet bytecodeSet = getClassContext().getBytecodeSet(getMethod());
		return (bytecodeSet != null) &&
		(bytecodeSet.get(Constants.NEW)
				|| bytecodeSet.get(Constants.ANEWARRAY)
				|| bytecodeSet.get(Constants.MULTIANEWARRAY));
	}
New to GrepCode? Check out our FAQ X