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.List;
 
 import  org.apache.bcel.Constants;
 import  org.apache.bcel.classfile.Code;
 import  org.apache.bcel.classfile.LocalVariable;
 import  org.apache.bcel.classfile.LocalVariableTable;
 import  org.apache.bcel.classfile.Method;
 import  org.apache.bcel.generic.Type;
 
 
 import  edu.umd.cs.findbugs.BugInstance;
 import  edu.umd.cs.findbugs.BugReporter;
 import  edu.umd.cs.findbugs.BytecodeScanningDetector;
 import  edu.umd.cs.findbugs.SourceLineAnnotation;
 import  edu.umd.cs.findbugs.ba.AnalysisContext;
 import  edu.umd.cs.findbugs.ba.ClassContext;
 import  edu.umd.cs.findbugs.ba.SourceFile;
 import  edu.umd.cs.findbugs.ba.SourceFinder;

looks for methods that correctly do not write to a parameter. To help document this, and to perhaps help the jvm optimize the invocation of this method, you should consider defining these parameters as final.
 
 public class FinalParameters extends BytecodeScanningDetector
 {
 	private BugReporter bugReporter;
 	private BitSet changedParms;
 	private String methodName;
 	private int firstLocalReg;
 	private boolean isStatic;
 	private boolean isAbstract;
 	private boolean srcInited;
 	private SourceLineAnnotation srcLineAnnotation;
 	private String[] sourceLines;


constructs a FP detector given the reporter to report bugs on

Parameters:
bugReporter the sync of bug reports
 
 	public FinalParameters(final BugReporter bugReporter) {
 		this. = bugReporter;
 	}

overrides the visitor to initialize the 'has source' flag

Parameters:
classContext the context object for the currently parsed class
 
 	public void visitClassContext(ClassContext classContext) {
 		 = false;
 		super.visitClassContext(classContext);
 	}

overrides the visitor capture source lines for the method

Parameters:
obj the method object for the currently parsed method
 
 	public void visitMethod(final Method obj) {
 		 = obj.getName();
 		if ("<clinit>".equals() || "<init>".equals())
 			return;
 
 		Type[] parms = Type.getArgumentTypes(obj.getSignature());
 		
 		if (parms.length > 0) {
     		 = (obj.getAccessFlags() & Constants.ACC_STATIC) != 0;
     		 = (obj.getAccessFlags() & Constants.ACC_ABSTRACT) != 0;
     		
    		 =  ? 0 : 1;
    		for (Type p : parms) {
    		    String parmSig = p.getSignature();
    		     += (parmSig.equals("J") || parmSig.equals("D")) ? 2 : 1;
    		}
    		
    	     = getSourceLines(obj);
		}
	}

reads the sourcefile based on the source line annotation for the method

Parameters:
obj the method object for the currently parsed method
Returns:
an array of source lines for the method
	private String[] getSourceLines(Method obj) {
		BufferedReader sourceReader = null;
			return ;
		try {
			 = SourceLineAnnotation.forEntireMethod(getClassContext().getJavaClass(), obj);
			if ( != null)
			{
				SourceFinder sourceFinder = AnalysisContext.currentAnalysisContext().getSourceFinder();
				SourceFile sourceFile = sourceFinder.findSourceFile(.getPackageName(), .getSourceFile());
				sourceReader = new BufferedReader(new InputStreamReader(sourceFile.getInputStream()));
				List<Stringlines = new ArrayList<String>(100);
				String line;
				while ((line = sourceReader.readLine()) != null)
					lines.add(line);
				 = lines.toArray(new String[lines.size()]);
			}
catch (IOException ioe) {
			//noop
		}
		finally {
			try {
				if (sourceReader != null)
					sourceReader.close();
catch (IOException ioe2) {
				//noop
			}
		}
		 = true;
		return ;
	}

overrides the visitor to find the source lines for the method header, to find non final parameters

Parameters:
obj the code object for the currently parsed method
	public void visitCode(final Code obj) {
		if ( == null)
			return;
			return;
		if ("<clinit>".equals() || "<init>".equals())
			return;
		int methodStart = .getStartLine() - 2;
		int methodLine = methodStart;
		String line;
		while ((methodLine >= 0) && (methodLine < .)) {
			line = [methodLine];
			if (line.indexOf() >= 0)
				break;
			methodLine--;
		}
		if (methodLine < 0)
			return;
		for (int i = methodLinei <= methodStarti++) {
			if ((i < 0) || (i >= .))
				return;
			line = [i];
			if (line.indexOf("final") >= 0)
				return;
		}
		 = new BitSet();
		super.visitCode(obj);
		BugInstance bi = null;
		for (int i = 0; i < i++) {
			if (.get(i)) {
			    .clear(i);
				continue;
			}
			String parmName = getRegisterName(obji);
			if (bi == null) {
				bi = new BugInstance(this"FP_FINAL_PARAMETERS", LOW_PRIORITY)
					.addClass(this)
					.addMethod(this)
					.addSourceLine(this, 0);
				.reportBug(bi);
			}
			bi.addString(parmName);
		}
         = null;
	}

overrides the visitor to find local variable reference stores to store them as changed

Parameters:
seen the currently parsed opcode
	public void sawOpcode(final int seen) {
		if ((seen == ASTORE) || ((seen >= ASTORE_0) && (seen <= ASTORE_3))) {
		    .set(RegisterUtils.getAStoreReg(this,  seen));
		}
	}

returns the variable name of the specified register slot

Parameters:
obj the currently parsed code object
reg the variable register of interest
Returns:
the variable name of the specified register
	private String getRegisterName(final Code objfinal int reg) {
		LocalVariableTable lvt = obj.getLocalVariableTable();
		if (lvt != null) {
			LocalVariable lv = lvt.getLocalVariable(reg, 0);
			if (lv != null)
				return lv.getName();
		}
		return String.valueOf(reg);
	}
New to GrepCode? Check out our FAQ X