Class Dataflow<Fact,AnalysisType extends DataflowAnalysis<Fact>>

java.lang.Object
edu.umd.cs.findbugs.ba.Dataflow<Fact,AnalysisType>
Direct Known Subclasses:
AbstractDataflow, BlockTypeDataflow, CallListDataflow, ConstantDataflow, LiveLocalStoreDataflow, LockDataflow, ObligationDataflow, ReturnPathDataflow, ReturnPathTypeDataflow, TypeDataflow, TypeQualifierDataflow

public class Dataflow<Fact,AnalysisType extends DataflowAnalysis<Fact>> extends Object
Perform dataflow analysis on a method using a control flow graph. Both forward and backward analyses can be performed.
  • The "start" point of each block is the entry (forward analyses) or the exit (backward analyses).
  • The "result" point of each block is the exit (forward analyses) or the entry (backward analyses).
The analysis's transfer function is applied to transform the meet of the results of the block's logical predecessors (the block's start facts) into the block's result facts.
See Also:
  • Field Details

    • cfg

      private final CFG cfg
    • analysis

      private final AnalysisType extends DataflowAnalysis<Fact> analysis
    • blockOrder

      private final BlockOrder blockOrder
    • isForwards

      private final boolean isForwards
    • numIterations

      private int numIterations
    • DEBUG

      public static boolean DEBUG
    • MAX_ITERS

      private static final int MAX_ITERS
  • Constructor Details

    • Dataflow

      public Dataflow(CFG cfg, AnalysisType analysis)
      Constructor.
      Parameters:
      cfg - the control flow graph
      analysis - the DataflowAnalysis to be run
  • Method Details

    • getFullyQualifiedMethodName

      private String getFullyQualifiedMethodName()
    • execute

      public void execute() throws DataflowAnalysisException
      Run the algorithm. Afterwards, caller can use the getStartFact() and getResultFact() methods to to get dataflow facts at start and result points of each block.
      Throws:
      DataflowAnalysisException
    • reportAnalysis

      private void reportAnalysis(String msg)
    • blockId

      private static String blockId(BasicBlock bb)
    • debug

      private static void debug(BasicBlock bb, String msg)
    • debug

      private static void debug(BasicBlock bb, BasicBlock pred, Edge edge, String msg)
    • getNumIterations

      public int getNumIterations()
      Return the number of iterations of the main execution loop.
    • getStartFact

      public Fact getStartFact(BasicBlock block)
      Get dataflow facts for start of given block.
    • getResultFact

      public Fact getResultFact(BasicBlock block)
      Get dataflow facts for end of given block.
    • getFactAtLocation

      public Fact getFactAtLocation(Location location) throws DataflowAnalysisException
      Get dataflow fact at (just before) given Location. Note "before" is meant in the logical sense, so for backward analyses, before means after the location in the control flow sense.
      Parameters:
      location - the Location
      Returns:
      the dataflow value at given Location
      Throws:
      DataflowAnalysisException
    • getFactAfterLocation

      public Fact getFactAfterLocation(Location location) throws DataflowAnalysisException
      Get the dataflow fact representing the point just after given Location. Note "after" is meant in the logical sense, so for backward analyses, after means before the location in the control flow sense.
      Parameters:
      location - the Location
      Returns:
      the dataflow value after given Location
      Throws:
      DataflowAnalysisException
    • getFactOnEdge

      public Fact getFactOnEdge(Edge edge) throws DataflowAnalysisException
      Get the fact that is true on the given control edge.
      Parameters:
      edge - the edge
      Returns:
      the fact that is true on the edge
      Throws:
      DataflowAnalysisException
    • getAnalysis

      public AnalysisType getAnalysis()
      Get the analysis object.
    • getCFG

      public CFG getCFG()
      Get the CFG object.
    • logicalPredecessorEdgeIterator

      private Iterator<Edge> logicalPredecessorEdgeIterator(BasicBlock block)
      Return an Iterator over edges that connect given block to its logical predecessors. For forward analyses, this is the incoming edges. For backward analyses, this is the outgoing edges.
    • logicalEntryBlock

      private BasicBlock logicalEntryBlock()
      Get the "logical" entry block of the CFG. For forward analyses, this is the entry block. For backward analyses, this is the exit block.
    • dumpDataflow

      public void dumpDataflow(AnalysisType analysis)