Class AnalysisResult<V extends AbstractValue<V>,​S extends Store<S>>

  • Type Parameters:
    V - type of the abstract value that is tracked
    S - the store type used in the analysis
    All Implemented Interfaces:
    org.plumelib.util.UniqueId

    public class AnalysisResult<V extends AbstractValue<V>,​S extends Store<S>>
    extends java.lang.Object
    implements org.plumelib.util.UniqueId
    An AnalysisResult represents the result of a org.checkerframework.dataflow analysis by providing the abstract values given a node or a tree. Note that it does not keep track of custom results computed by some analysis.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected java.util.Map<TransferInput<V,​S>,​java.util.IdentityHashMap<Node,​TransferResult<V,​S>>> analysisCaches
      Caches of the analysis results for each input for the block of the node and each node.
      protected java.util.Map<javax.lang.model.element.VariableElement,​V> finalLocalValues
      Map from (effectively final) local variable elements to their abstract value.
      protected java.util.IdentityHashMap<Node,​V> nodeValues
      Abstract values of nodes.
      protected java.util.IdentityHashMap<com.sun.source.tree.UnaryTree,​com.sun.source.tree.BinaryTree> postfixLookup
      Map from postfix increment or decrement trees that are AST UnaryTrees to the synthetic tree that is v + 1 or v - 1.
      protected java.util.IdentityHashMap<Block,​TransferInput<V,​S>> stores
      The stores before every method call.
      protected java.util.IdentityHashMap<com.sun.source.tree.Tree,​java.util.Set<Node>> treeLookup
      Map from AST Trees to sets of Nodes.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
        AnalysisResult​(java.util.IdentityHashMap<Node,​V> nodeValues, java.util.IdentityHashMap<Block,​TransferInput<V,​S>> stores, java.util.IdentityHashMap<com.sun.source.tree.Tree,​java.util.Set<Node>> treeLookup, java.util.IdentityHashMap<com.sun.source.tree.UnaryTree,​com.sun.source.tree.BinaryTree> postfixLookup, java.util.Map<javax.lang.model.element.VariableElement,​V> finalLocalValues)
      Initialize with given mappings and empty cache.
      protected AnalysisResult​(java.util.IdentityHashMap<Node,​V> nodeValues, java.util.IdentityHashMap<Block,​TransferInput<V,​S>> stores, java.util.IdentityHashMap<com.sun.source.tree.Tree,​java.util.Set<Node>> treeLookup, java.util.IdentityHashMap<com.sun.source.tree.UnaryTree,​com.sun.source.tree.BinaryTree> postfixLookup, java.util.Map<javax.lang.model.element.VariableElement,​V> finalLocalValues, java.util.Map<TransferInput<V,​S>,​java.util.IdentityHashMap<Node,​TransferResult<V,​S>>> analysisCaches)
      Initialize with given mappings.
        AnalysisResult​(java.util.Map<TransferInput<V,​S>,​java.util.IdentityHashMap<Node,​TransferResult<V,​S>>> analysisCaches)
      Initialize empty result with specified cache.
    • Field Detail

      • nodeValues

        protected java.util.IdentityHashMap<Node,​V extends AbstractValue<V>> nodeValues
        Abstract values of nodes.
      • treeLookup

        protected java.util.IdentityHashMap<com.sun.source.tree.Tree,​java.util.Set<Node>> treeLookup
        Map from AST Trees to sets of Nodes.

        Some of those Nodes might not be keys in nodeValues. One reason is that the Node is unreachable in the control flow graph, so dataflow never gave it a value.

      • postfixLookup

        protected java.util.IdentityHashMap<com.sun.source.tree.UnaryTree,​com.sun.source.tree.BinaryTree> postfixLookup
        Map from postfix increment or decrement trees that are AST UnaryTrees to the synthetic tree that is v + 1 or v - 1.
      • finalLocalValues

        protected final java.util.Map<javax.lang.model.element.VariableElement,​V extends AbstractValue<V>> finalLocalValues
        Map from (effectively final) local variable elements to their abstract value.
    • Constructor Detail

      • AnalysisResult

        protected AnalysisResult​(java.util.IdentityHashMap<Node,​V> nodeValues,
                                 java.util.IdentityHashMap<Block,​TransferInput<V,​S>> stores,
                                 java.util.IdentityHashMap<com.sun.source.tree.Tree,​java.util.Set<Node>> treeLookup,
                                 java.util.IdentityHashMap<com.sun.source.tree.UnaryTree,​com.sun.source.tree.BinaryTree> postfixLookup,
                                 java.util.Map<javax.lang.model.element.VariableElement,​V> finalLocalValues,
                                 java.util.Map<TransferInput<V,​S>,​java.util.IdentityHashMap<Node,​TransferResult<V,​S>>> analysisCaches)
        Initialize with given mappings.
        Parameters:
        nodeValues - nodeValues
        stores - stores
        treeLookup - treeLookup
        postfixLookup - postfixLookup
        finalLocalValues - finalLocalValues
        analysisCaches - analysisCaches
      • AnalysisResult

        public AnalysisResult​(java.util.IdentityHashMap<Node,​V> nodeValues,
                              java.util.IdentityHashMap<Block,​TransferInput<V,​S>> stores,
                              java.util.IdentityHashMap<com.sun.source.tree.Tree,​java.util.Set<Node>> treeLookup,
                              java.util.IdentityHashMap<com.sun.source.tree.UnaryTree,​com.sun.source.tree.BinaryTree> postfixLookup,
                              java.util.Map<javax.lang.model.element.VariableElement,​V> finalLocalValues)
        Initialize with given mappings and empty cache.
        Parameters:
        nodeValues - nodeValues
        stores - stores
        treeLookup - treeLookup
        postfixLookup - postfixLookup
        finalLocalValues - finalLocalValues
      • AnalysisResult

        public AnalysisResult​(java.util.Map<TransferInput<V,​S>,​java.util.IdentityHashMap<Node,​TransferResult<V,​S>>> analysisCaches)
        Initialize empty result with specified cache.
        Parameters:
        analysisCaches - analysisCaches
    • Method Detail

      • combine

        public void combine​(AnalysisResult<V,​S> other)
        Combine with another analysis result.
        Parameters:
        other - an analysis result to combine with this
      • getFinalLocalValues

        public java.util.Map<javax.lang.model.element.VariableElement,​V> getFinalLocalValues()
        Returns the value of effectively final local variables.
        Returns:
        the value of effectively final local variables
      • getValue

        public @Nullable V getValue​(Node n)
        Returns the abstract value for Node n, or null if no information is available. Note that if the analysis has not finished yet, this value might not represent the final value for this node.
        Parameters:
        n - a node
        Returns:
        the abstract value for Node n, or null if no information is available
      • getValue

        public @Nullable V getValue​(com.sun.source.tree.Tree t)
        Returns the abstract value for Tree t, or null if no information is available. Note that if the analysis has not finished yet, this value might not represent the final value for this node.
        Parameters:
        t - a tree
        Returns:
        the abstract value for Tree t, or null if no information is available
      • getNodesForTree

        public @Nullable java.util.Set<Node> getNodesForTree​(com.sun.source.tree.Tree tree)
        Returns the Nodes corresponding to a particular Tree. Multiple Nodes can correspond to a single Tree because of several reasons:
        1. In a lambda expression such as () -> 5 the 5 is both an IntegerLiteralNode and a LambdaResultExpressionNode.
        2. Widening and narrowing primitive conversions can result in WideningConversionNode and NarrowingConversionNode.
        3. Automatic String conversion can result in a StringConversionNode.
        4. Trees for finally blocks are cloned to achieve a precise CFG. Any Tree within a finally block can have multiple corresponding Nodes attached to them.
        Callers of this method should always iterate through the returned set, possibly ignoring all Nodes they are not interested in.
        Parameters:
        tree - a tree
        Returns:
        the set of Nodes for a given Tree
      • getPostfixBinaryTree

        public com.sun.source.tree.BinaryTree getPostfixBinaryTree​(com.sun.source.tree.UnaryTree postfixTree)
        Returns the synthetic v + 1 or v - 1 corresponding to the postfix increment or decrement tree.
        Parameters:
        postfixTree - a postfix increment or decrement tree
        Returns:
        the synthetic v + 1 or v - 1 corresponding to the postfix increment or decrement tree
      • getStoreBefore

        public @Nullable S getStoreBefore​(com.sun.source.tree.Tree tree)
        Returns the store immediately before a given Tree.
        Parameters:
        tree - a tree
        Returns:
        the store immediately before a given Tree
      • getStoreBefore

        public @Nullable S getStoreBefore​(Node node)
        Returns the store immediately before a given Node.
        Parameters:
        node - a node
        Returns:
        the store immediately before a given Node
      • getStoreBefore

        public S getStoreBefore​(Block block)
        Returns the regular store immediately before a given Block.
        Parameters:
        block - a block
        Returns:
        the store right before the given block
      • getStoreAfter

        public S getStoreAfter​(Block block)
        Returns the regular store immediately after a given block.
        Parameters:
        block - a block
        Returns:
        the store after the given block
      • getStoreAfter

        public @Nullable S getStoreAfter​(com.sun.source.tree.Tree tree)
        Returns the store immediately after a given Tree.
        Parameters:
        tree - a tree
        Returns:
        the store immediately after a given Tree
      • getStoreAfter

        public @Nullable S getStoreAfter​(Node node)
        Returns the store immediately after a given Node.
        Parameters:
        node - a node
        Returns:
        the store immediately after a given Node
      • runAnalysisFor

        protected @Nullable S runAnalysisFor​(Node node,
                                             Analysis.BeforeOrAfter preOrPost)
        Runs the analysis again within the block of node and returns the store at the location of node. If before is true, then the store immediately before the Node node is returned. Otherwise, the store after node is returned.

        If the given Node cannot be reached (in the control flow graph), then null is returned.

        Parameters:
        node - the node to analyze
        preOrPost - which store to return: the store immediately before node or the store after node
        Returns:
        the store before or after node (depends on the value of before) after running the analysis
      • runAnalysisFor

        public static <V extends AbstractValue<V>,​S extends Store<S>> S runAnalysisFor​(Node node,
                                                                                             Analysis.BeforeOrAfter preOrPost,
                                                                                             TransferInput<V,​S> transferInput,
                                                                                             java.util.IdentityHashMap<Node,​V> nodeValues,
                                                                                             @Nullable java.util.Map<TransferInput<V,​S>,​java.util.IdentityHashMap<Node,​TransferResult<V,​S>>> analysisCaches)
        Runs the analysis again within the block of node and returns the store at the location of node. If before is true, then the store immediately before the Node node is returned. Otherwise, the store immediately after node is returned. If analysisCaches is not null, this method uses a cache. analysisCaches is a map of a block of node to the cached analysis result. If the cache for transferInput is not in analysisCaches, this method creates new cache and stores it in analysisCaches. The cache is a map of nodes to the analysis results of the nodes.
        Type Parameters:
        V - the abstract value type to be tracked by the analysis
        S - the store type used in the analysis
        Parameters:
        node - the node to analyze
        preOrPost - which store to return: the store immediately before node or the store after node
        transferInput - a transfer input
        nodeValues - nodeValues
        analysisCaches - analysisCaches
        Returns:
        the store before or after node (depends on the value of before) after running the analysis
      • toStringDebug

        public java.lang.String toStringDebug()
        Returns a verbose string representation of this, useful for debugging.
        Returns:
        a string representation of this
      • nodeValuesToString

        public static <V> java.lang.String nodeValuesToString​(java.util.Map<Node,​V> nodeValues)
        Returns a verbose string representation, useful for debugging. The map has the same type as the nodeValues field.
        Type Parameters:
        V - the type of values in the map
        Parameters:
        nodeValues - a map to format
        Returns:
        a printed representation of the given map
      • treeLookupToString

        public static java.lang.String treeLookupToString​(java.util.Map<com.sun.source.tree.Tree,​java.util.Set<Node>> treeLookup)
        Returns a verbose string representation of a map, useful for debugging. The map has the same type as the treeLookup field.
        Parameters:
        treeLookup - a map to format
        Returns:
        a printed representation of the given map