[Fb-contrib-commit] fb-contrib/src/com/mebigfatguy/fbcontrib/detect FinalParameters.java,NONE,1.1
Brought to you by:
dbrosius
From: Dave B. <dbr...@us...> - 2005-09-19 02:25:57
|
Update of /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28921/src/com/mebigfatguy/fbcontrib/detect Added Files: FinalParameters.java Log Message: Initial Checkin: FinalParameters --- NEW FILE: FinalParameters.java --- package com.mebigfatguy.fbcontrib.detect; import java.util.HashSet; import java.util.Set; 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.StatelessDetector; public class FinalParameters extends BytecodeScanningDetector implements StatelessDetector { private BugReporter bugReporter; private Set<Integer> changedParms; private int parmCount; private boolean isStatic; private boolean isAbstract; public FinalParameters(BugReporter bugReporter) { this.bugReporter = bugReporter; } public Object clone() throws CloneNotSupportedException { return super.clone(); } public void visitMethod(Method obj) { isStatic = (obj.getAccessFlags() & Constants.ACC_STATIC) != 0; isAbstract = (obj.getAccessFlags() & Constants.ACC_ABSTRACT) != 0; parmCount = Type.getArgumentTypes(obj.getSignature()).length; super.visitMethod(obj); } public void visitCode(Code obj) { if (isAbstract) return; changedParms = new HashSet<Integer>(); super.visitCode(obj); for (int i = 0; i < parmCount; i++) { if (changedParms.remove(new Integer(i))) continue; int reg; if (!isStatic) reg = i + 1; else reg = i; String parmName = getRegisterName(obj, reg); bugReporter.reportBug( new BugInstance( this, "FP_FINAL_PARAMETERS", LOW_PRIORITY) .addClass(this) .addMethod(this) .addSourceLine(this, 0) .addString(parmName)); } } public void sawOpcode(int seen) { if ((seen == ASTORE) || ((seen >= ASTORE_0) && (seen <= ASTORE_3))) { int parm = getAStoreParameter(seen); if (parm >= 0) changedParms.add(new Integer(parm)); } } private String getRegisterName(Code obj, 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); } private int getAStoreParameter(int seen) { int reg; if (seen == ASTORE) reg = getRegisterOperand(); else reg = seen - ASTORE_0; if (!isStatic) reg--; if (reg >= parmCount) reg = -1; return reg; } } |