Package edu.umd.cs.findbugs.detect
Class DuplicateBranches
- java.lang.Object
-
- edu.umd.cs.findbugs.visitclass.BetterVisitor
-
- edu.umd.cs.findbugs.visitclass.PreorderVisitor
-
- edu.umd.cs.findbugs.detect.DuplicateBranches
-
- All Implemented Interfaces:
Detector
,Priorities
,org.apache.bcel.classfile.Visitor
public class DuplicateBranches extends PreorderVisitor implements Detector
-
-
Field Summary
Fields Modifier and Type Field Description private BugReporter
bugReporter
private ClassContext
classContext
private java.util.Collection<BugInstance>
pendingBugs
-
Fields inherited from interface edu.umd.cs.findbugs.Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
-
-
Constructor Summary
Constructors Constructor Description DuplicateBranches(BugReporter bugReporter)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
findIfElseDuplicates(CFG cfg, org.apache.bcel.classfile.Method method, BasicBlock bb)
private void
findSwitchDuplicates(CFG cfg, org.apache.bcel.classfile.Method method, BasicBlock bb)
private org.apache.bcel.generic.InstructionHandle
findThenFinish(CFG cfg, BasicBlock thenBB, int elsePos)
private byte[]
getCodeBytes(org.apache.bcel.classfile.Method m, int start, int end)
private java.math.BigInteger
getCodeBytesAsBigInt(org.apache.bcel.classfile.Method method, int[] switchPos, int i, int endPos)
private static org.apache.bcel.generic.InstructionHandle
getDeepFirstInstruction(CFG cfg, BasicBlock bb)
Like bb.getFirstInstruction() except that if null is returned it will follow the FALL_THROUGH_EDGE (if any)private static int
getFinalTarget(CFG cfg, int myPos, java.util.Collection<org.apache.bcel.generic.InstructionHandle> prevs)
determine the end position (exclusive) of the final case by looking at the gotos at the ends of the other casesvoid
report()
This method is called after all classes to be visited.private void
updateMap(java.util.HashMap<java.math.BigInteger,java.util.Collection<java.lang.Integer>> map, int i, java.math.BigInteger clauseAsInt)
void
visitClassContext(ClassContext classContext)
Visit the ClassContext for a class which should be analyzed for instances of bug patterns.void
visitMethod(org.apache.bcel.classfile.Method method)
-
Methods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor
amVisitingMainMethod, asUnsignedByte, doVisitMethod, getClassDescriptor, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldDescriptor, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodDescriptor, getMethodName, getMethodSig, getMethodVisitOrder, getNumberArguments, getNumberMethodArguments, getPackageName, getSizeOfSurroundingTryBlock, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getSurroundingCaughtExceptions, getSurroundingCaughtExceptions, getSurroundingCaughtExceptionTypes, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotation, visitAnnotationDefault, visitAnnotationEntry, visitBootstrapMethods, visitCode, visitConstantInvokeDynamic, visitConstantMethodHandle, visitConstantMethodType, visitConstantModule, visitConstantPackage, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitMethodParameters, visitParameterAnnotation, visitParameterAnnotationEntry, visitStackMap, visitStackMapEntry
-
Methods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor
clone, report, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitSignature, visitSourceFile, visitSynthetic, visitUnknown
-
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.apache.bcel.classfile.Visitor
visitConstantDynamic, visitMethodParameter, visitModule, visitModuleExports, visitModuleMainClass, visitModuleOpens, visitModulePackages, visitModuleProvides, visitModuleRequires, visitNestHost, visitNestMembers, visitRecord, visitRecordComponent, visitStackMapType
-
-
-
-
Field Detail
-
classContext
private ClassContext classContext
-
bugReporter
private final BugReporter bugReporter
-
pendingBugs
private final java.util.Collection<BugInstance> pendingBugs
-
-
Constructor Detail
-
DuplicateBranches
public DuplicateBranches(BugReporter bugReporter)
-
-
Method Detail
-
visitClassContext
public void visitClassContext(ClassContext classContext)
Description copied from interface:Detector
Visit the ClassContext for a class which should be analyzed for instances of bug patterns.- Specified by:
visitClassContext
in interfaceDetector
- Parameters:
classContext
- the ClassContext
-
visitMethod
public void visitMethod(org.apache.bcel.classfile.Method method)
- Specified by:
visitMethod
in interfaceorg.apache.bcel.classfile.Visitor
- Overrides:
visitMethod
in classBetterVisitor
-
findIfElseDuplicates
private void findIfElseDuplicates(CFG cfg, org.apache.bcel.classfile.Method method, BasicBlock bb)
-
getDeepFirstInstruction
private static org.apache.bcel.generic.InstructionHandle getDeepFirstInstruction(CFG cfg, BasicBlock bb)
Like bb.getFirstInstruction() except that if null is returned it will follow the FALL_THROUGH_EDGE (if any)
-
findSwitchDuplicates
private void findSwitchDuplicates(CFG cfg, org.apache.bcel.classfile.Method method, BasicBlock bb)
-
updateMap
private void updateMap(java.util.HashMap<java.math.BigInteger,java.util.Collection<java.lang.Integer>> map, int i, java.math.BigInteger clauseAsInt)
-
getCodeBytesAsBigInt
private java.math.BigInteger getCodeBytesAsBigInt(org.apache.bcel.classfile.Method method, int[] switchPos, int i, int endPos)
-
getFinalTarget
private static int getFinalTarget(CFG cfg, int myPos, java.util.Collection<org.apache.bcel.generic.InstructionHandle> prevs)
determine the end position (exclusive) of the final case by looking at the gotos at the ends of the other cases
-
getCodeBytes
private byte[] getCodeBytes(org.apache.bcel.classfile.Method m, int start, int end)
-
findThenFinish
private org.apache.bcel.generic.InstructionHandle findThenFinish(CFG cfg, BasicBlock thenBB, int elsePos)
-
-