Package edu.umd.cs.findbugs.ba
Class BetterCFGBuilder2
- java.lang.Object
-
- edu.umd.cs.findbugs.ba.BetterCFGBuilder2
-
- All Implemented Interfaces:
CFGBuilder,Debug,EdgeTypes
public class BetterCFGBuilder2 extends java.lang.Object implements CFGBuilder, EdgeTypes, Debug
A CFGBuilder that really tries to construct accurate control flow graphs. The CFGs it creates have accurate exception edges, and have accurately inlined JSR subroutines.- See Also:
CFG
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classBetterCFGBuilder2.ContextInlining context.private static classBetterCFGBuilder2.EscapeTargetA placeholder for a control edge that escapes its subroutine to return control back to an outer (calling) subroutine.private classBetterCFGBuilder2.SubroutineJSR subroutine.private static classBetterCFGBuilder2.WorkListItemA work list item for creating the CFG for a subroutine.
-
Field Summary
Fields Modifier and Type Field Description private java.util.Map<FieldDescriptor,java.lang.Integer>addedFieldsprivate java.util.Map<MethodDescriptor,java.lang.Integer>addedMethodsprivate CFGcfgprivate org.apache.bcel.generic.ConstantPoolGencpgprivate static booleanDEBUGprivate ExceptionHandlerMapexceptionHandlerMapprivate java.util.IdentityHashMap<org.apache.bcel.generic.InstructionHandle,BetterCFGBuilder2.Subroutine>jsrSubroutineMapprivate org.apache.bcel.generic.MethodGenmethodGenprivate java.util.LinkedList<BetterCFGBuilder2.Subroutine>subroutineWorkListprivate BetterCFGBuilder2.SubroutinetopLevelSubroutineprivate java.util.BitSetusedInstructionSet-
Fields inherited from interface edu.umd.cs.findbugs.ba.Debug
VERIFY_INTEGRITY
-
Fields inherited from interface edu.umd.cs.findbugs.ba.EdgeTypes
BACKEDGE_SOURCE_EDGE, BACKEDGE_TARGET_EDGE, CHECKED_EXCEPTIONS_FLAG, EXIT_EDGE, EXPLICIT_EXCEPTIONS_FLAG, FALL_THROUGH_EDGE, GOTO_EDGE, HANDLED_EXCEPTION_EDGE, IFCMP_EDGE, JSR_EDGE, RET_EDGE, RETURN_EDGE, START_EDGE, SWITCH_DEFAULT_EDGE, SWITCH_EDGE, UNHANDLED_EXCEPTION_EDGE, UNKNOWN_EDGE
-
-
Constructor Summary
Constructors Constructor Description BetterCFGBuilder2(MethodDescriptor descriptor, org.apache.bcel.generic.MethodGen methodGen)Constructor.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidbuild()Build the CFG.private voidbuild(BetterCFGBuilder2.Subroutine subroutine)Build a subroutine.CFGgetCFG()Get the CFG built by this object.intgetIndex(FieldDescriptor f)private intgetIndex(MethodDescriptor method)private voidhandleExceptions(BetterCFGBuilder2.Subroutine subroutine, org.apache.bcel.generic.InstructionHandle pei, BasicBlock etb)Add exception edges for given instruction.voidinline(BetterCFGBuilder2.Context context)Inline a subroutine into a calling context.private CFGinlineAll()Inline all JSR subroutines into the top-level subroutine.private static booleanisMerge(org.apache.bcel.generic.InstructionHandle handle)Determine whether or not the given instruction is a control flow merge.private booleanisPEI(org.apache.bcel.generic.InstructionHandle handle)Return whether or not the given instruction can throw exceptions.private booleanisSafeFieldSource(org.apache.bcel.generic.InstructionHandle handle)static voidmain(java.lang.String[] argv)Test driver.voidoptimize(org.apache.bcel.generic.InstructionList instructionList)
-
-
-
Field Detail
-
DEBUG
private static final boolean DEBUG
-
methodGen
private final org.apache.bcel.generic.MethodGen methodGen
-
cpg
private final org.apache.bcel.generic.ConstantPoolGen cpg
-
exceptionHandlerMap
private final ExceptionHandlerMap exceptionHandlerMap
-
usedInstructionSet
private final java.util.BitSet usedInstructionSet
-
subroutineWorkList
private final java.util.LinkedList<BetterCFGBuilder2.Subroutine> subroutineWorkList
-
jsrSubroutineMap
private final java.util.IdentityHashMap<org.apache.bcel.generic.InstructionHandle,BetterCFGBuilder2.Subroutine> jsrSubroutineMap
-
addedFields
private final java.util.Map<FieldDescriptor,java.lang.Integer> addedFields
-
addedMethods
private final java.util.Map<MethodDescriptor,java.lang.Integer> addedMethods
-
topLevelSubroutine
private BetterCFGBuilder2.Subroutine topLevelSubroutine
-
cfg
private CFG cfg
-
-
Constructor Detail
-
BetterCFGBuilder2
public BetterCFGBuilder2(@Nonnull MethodDescriptor descriptor, @Nonnull org.apache.bcel.generic.MethodGen methodGen)Constructor.- Parameters:
methodGen- the method to build a CFG for
-
-
Method Detail
-
getIndex
public int getIndex(FieldDescriptor f)
-
getIndex
private int getIndex(MethodDescriptor method)
-
optimize
public void optimize(org.apache.bcel.generic.InstructionList instructionList)
-
build
public void build() throws CFGBuilderExceptionDescription copied from interface:CFGBuilderBuild the CFG.- Specified by:
buildin interfaceCFGBuilder- Throws:
CFGBuilderException
-
getCFG
public CFG getCFG()
Description copied from interface:CFGBuilderGet the CFG built by this object. Assumes that the build() method has already been called.- Specified by:
getCFGin interfaceCFGBuilder- Returns:
- the CFG
-
build
private void build(BetterCFGBuilder2.Subroutine subroutine) throws CFGBuilderException
Build a subroutine. We iteratively add basic blocks to the subroutine until there are no more blocks reachable from the calling context. As JSR instructions are encountered, new Subroutines are added to the subroutine work list.- Parameters:
subroutine- the subroutine- Throws:
CFGBuilderException
-
handleExceptions
private void handleExceptions(BetterCFGBuilder2.Subroutine subroutine, org.apache.bcel.generic.InstructionHandle pei, BasicBlock etb)
Add exception edges for given instruction.- Parameters:
subroutine- the subroutine containing the instructionpei- the instruction which throws an exceptionetb- the exception thrower block (ETB) for the instruction
-
isPEI
private boolean isPEI(org.apache.bcel.generic.InstructionHandle handle) throws CFGBuilderExceptionReturn whether or not the given instruction can throw exceptions.- Parameters:
handle- the instruction- Returns:
- true if the instruction can throw an exception, false otherwise
- Throws:
CFGBuilderException
-
isSafeFieldSource
private boolean isSafeFieldSource(org.apache.bcel.generic.InstructionHandle handle)
- Parameters:
handle- instruction handle which loads the object for further GETFIELD/PUTFIELD operation- Returns:
- true if this object is known to be non-null
-
isMerge
private static boolean isMerge(org.apache.bcel.generic.InstructionHandle handle)
Determine whether or not the given instruction is a control flow merge.- Parameters:
handle- the instruction- Returns:
- true if the instruction is a control merge, false otherwise
-
inlineAll
private CFG inlineAll() throws CFGBuilderException
Inline all JSR subroutines into the top-level subroutine. This produces a complete CFG for the entire method, in which all JSR subroutines are inlined.- Returns:
- the CFG for the method
- Throws:
CFGBuilderException
-
inline
public void inline(BetterCFGBuilder2.Context context) throws CFGBuilderException
Inline a subroutine into a calling context.- Parameters:
context- the Context- Throws:
CFGBuilderException
-
main
public static void main(java.lang.String[] argv) throws java.lang.ExceptionTest driver.- Throws:
java.lang.Exception
-
-