Update of /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17455/src/com/mebigfatguy/fbcontrib/detect
Modified Files:
UnnecessaryStoreBeforeReturn.java
Log Message:
remove false positives when the load (for the return) is a branch target.
Index: UnnecessaryStoreBeforeReturn.java
===================================================================
RCS file: /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect/UnnecessaryStoreBeforeReturn.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- UnnecessaryStoreBeforeReturn.java 3 Dec 2005 16:47:19 -0000 1.2
+++ UnnecessaryStoreBeforeReturn.java 4 Dec 2005 05:32:46 -0000 1.3
@@ -18,6 +18,9 @@
*/
package com.mebigfatguy.fbcontrib.detect;
+import java.util.HashSet;
+import java.util.Set;
+
import org.apache.bcel.classfile.Method;
import edu.umd.cs.findbugs.BugInstance;
@@ -30,8 +33,27 @@
private static final int SEEN_NOTHING = 0;
private static final int SEEN_STORE = 1;
private static final int SEEN_LOAD = 2;
+ private static final Set<Integer> branchInstructions = new HashSet<Integer>();
+ static {
+ branchInstructions.add(new Integer(GOTO));
+ branchInstructions.add(new Integer(IFEQ));
+ branchInstructions.add(new Integer(IFNE));
+ branchInstructions.add(new Integer(IFLT));
+ branchInstructions.add(new Integer(IFGE));
+ branchInstructions.add(new Integer(IFGT));
+ branchInstructions.add(new Integer(IFLE));
+ branchInstructions.add(new Integer(IF_ICMPEQ));
+ branchInstructions.add(new Integer(IF_ICMPNE));
+ branchInstructions.add(new Integer(IF_ICMPLT));
+ branchInstructions.add(new Integer(IF_ICMPGE));
+ branchInstructions.add(new Integer(IF_ICMPGT));
+ branchInstructions.add(new Integer(IF_ICMPLE));
+ branchInstructions.add(new Integer(IF_ACMPEQ));
+ branchInstructions.add(new Integer(IF_ACMPNE));
+ }
private BugReporter bugReporter;
+ private Set<Integer> branchTargets = new HashSet<Integer>();
private int state;
private int storeReg;
private int loadReg;
@@ -46,6 +68,7 @@
public void visitMethod(Method obj) {
state = SEEN_NOTHING;
+ branchTargets.clear();
}
public void sawOpcode(int seen) {
@@ -73,6 +96,11 @@
break;
case SEEN_STORE:
+ if (branchTargets.contains(new Integer(getPC()))) {
+ seen = SEEN_NOTHING;
+ return;
+ }
+
if ((seen >= ILOAD) && (seen <= ALOAD)) {
loadReg = getRegisterOperand();
state = (storeReg == loadReg) ? SEEN_LOAD : SEEN_NOTHING;
@@ -105,6 +133,11 @@
state = SEEN_NOTHING;
break;
}
+
+ if (branchInstructions.contains(new Integer(seen))) {
+ branchTargets.add(new Integer(getBranchTarget()));
+ }
+
}
}
|