[Fb-contrib-commit] fb-contrib/src/com/mebigfatguy/fbcontrib/detect UnnecessaryStoreBeforeReturn.jav
Brought to you by:
dbrosius
|
From: Dave B. <dbr...@us...> - 2005-12-04 05:32:54
|
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())); + } + } } |