| package org.checkerframework.dataflow.cfg.visualize; |
| |
| import java.util.Map; |
| import org.checkerframework.checker.nullness.qual.Nullable; |
| import org.checkerframework.dataflow.analysis.AbstractValue; |
| import org.checkerframework.dataflow.analysis.Analysis; |
| import org.checkerframework.dataflow.analysis.Store; |
| import org.checkerframework.dataflow.analysis.TransferFunction; |
| import org.checkerframework.dataflow.cfg.ControlFlowGraph; |
| import org.checkerframework.dataflow.cfg.block.Block; |
| import org.checkerframework.dataflow.cfg.block.ConditionalBlock; |
| import org.checkerframework.dataflow.cfg.block.SpecialBlock; |
| import org.checkerframework.dataflow.cfg.node.Node; |
| import org.checkerframework.dataflow.expression.ArrayAccess; |
| import org.checkerframework.dataflow.expression.ClassName; |
| import org.checkerframework.dataflow.expression.FieldAccess; |
| import org.checkerframework.dataflow.expression.LocalVariable; |
| import org.checkerframework.dataflow.expression.MethodCall; |
| |
| /** |
| * Perform some visualization on a control flow graph. The particular operations depend on the |
| * implementation. |
| * |
| * @param <V> the abstract value type to be tracked by the analysis |
| * @param <S> the store type used in the analysis |
| * @param <T> the transfer function type that is used to approximate runtime behavior |
| */ |
| public interface CFGVisualizer< |
| V extends AbstractValue<V>, S extends Store<S>, T extends TransferFunction<V, S>> { |
| /** |
| * Initialization method guaranteed to be called once before the first invocation of {@link |
| * #visualize}. |
| * |
| * @param args implementation-dependent options |
| */ |
| void init(Map<String, Object> args); |
| |
| /** |
| * Returns the separator for lines within a node's representation. |
| * |
| * @return the separator for lines within a node's representation |
| */ |
| public abstract String getSeparator(); |
| |
| /** |
| * Output a visualization representing the control flow graph starting at {@code entry}. The |
| * concrete actions are implementation dependent. |
| * |
| * <p>An invocation {@code visualize(cfg, entry, null);} does not output stores at the beginning |
| * of basic blocks. |
| * |
| * @param cfg the CFG to visualize |
| * @param entry the entry node of the control flow graph to be represented |
| * @param analysis an analysis containing information about the program represented by the CFG. |
| * The information includes {@link Store}s that are valid at the beginning of basic blocks |
| * reachable from {@code entry} and per-node information for value producing {@link Node}s. |
| * Can also be {@code null} to indicate that this information should not be output. |
| * @return visualization results, e.g. generated file names ({@link DOTCFGVisualizer}) or a String |
| * representation of the CFG ({@link StringCFGVisualizer}) |
| */ |
| @Nullable Map<String, Object> visualize( |
| ControlFlowGraph cfg, Block entry, @Nullable Analysis<V, S, T> analysis); |
| |
| /** |
| * Delegate the visualization responsibility to the passed {@link Store} instance, which will call |
| * back to this visualizer instance for sub-components. |
| * |
| * @param store the store to visualize |
| * @return the String representation of the given store |
| */ |
| String visualizeStore(S store); |
| |
| /** |
| * Called by {@code CFAbstractStore#internalVisualize()} to visualize a local variable. |
| * |
| * @param localVar the local variable |
| * @param value the value of the local variable |
| * @return the String representation of the local variable |
| */ |
| String visualizeStoreLocalVar(LocalVariable localVar, V value); |
| |
| /** |
| * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of the current |
| * object {@code this} in this Store. |
| * |
| * @param value the value of the current object {@code this} |
| * @return the String representation of {@code this} |
| */ |
| String visualizeStoreThisVal(V value); |
| |
| /** |
| * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of one field |
| * collected by this Store. |
| * |
| * @param fieldAccess the field |
| * @param value the value of the field |
| * @return the String representation of the field |
| */ |
| String visualizeStoreFieldVal(FieldAccess fieldAccess, V value); |
| |
| /** |
| * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of one array |
| * collected by this Store. |
| * |
| * @param arrayValue the array |
| * @param value the value of the array |
| * @return the String representation of the array |
| */ |
| String visualizeStoreArrayVal(ArrayAccess arrayValue, V value); |
| |
| /** |
| * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of pure method |
| * calls collected by this Store. |
| * |
| * @param methodCall the pure method call |
| * @param value the value of the pure method call |
| * @return the String representation of the pure method call |
| */ |
| String visualizeStoreMethodVals(MethodCall methodCall, V value); |
| |
| /** |
| * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of class names |
| * collected by this Store. |
| * |
| * @param className the class name |
| * @param value the value of the class name |
| * @return the String representation of the class name |
| */ |
| String visualizeStoreClassVals(ClassName className, V value); |
| |
| /** |
| * Called by {@code CFAbstractStore#internalVisualize()} to visualize the specific information |
| * collected according to the specific kind of Store. Currently, these Stores call this method: |
| * {@code LockStore}, {@code NullnessStore}, and {@code InitializationStore} to visualize |
| * additional information. |
| * |
| * @param keyName the name of the specific information to be visualized |
| * @param value the value of the specific information to be visualized |
| * @return the String representation of the specific information |
| */ |
| String visualizeStoreKeyVal(String keyName, Object value); |
| |
| /** |
| * Visualize a block based on the analysis. |
| * |
| * @param bb the block |
| * @param analysis the current analysis |
| * @return the String representation of the given block |
| */ |
| String visualizeBlock(Block bb, @Nullable Analysis<V, S, T> analysis); |
| |
| /** |
| * Visualize a SpecialBlock. |
| * |
| * @param sbb the special block |
| * @return the String representation of the type of the special block {@code sbb}: entry, exit, or |
| * exceptional-exit |
| */ |
| String visualizeSpecialBlock(SpecialBlock sbb); |
| |
| /** |
| * Visualize a ConditionalBlock. |
| * |
| * @param cbb the conditional block |
| * @return the String representation of the conditional block |
| */ |
| String visualizeConditionalBlock(ConditionalBlock cbb); |
| |
| /** |
| * Visualize the transferInput before a Block based on the analysis. |
| * |
| * @param bb the block |
| * @param analysis the current analysis |
| * @return the String representation of the transferInput before the given block |
| */ |
| String visualizeBlockTransferInputBefore(Block bb, Analysis<V, S, T> analysis); |
| |
| /** |
| * Visualize the transferInput after a Block based on the analysis. |
| * |
| * @param bb the block |
| * @param analysis the current analysis |
| * @return the String representation of the transferInput after the given block |
| */ |
| String visualizeBlockTransferInputAfter(Block bb, Analysis<V, S, T> analysis); |
| |
| /** |
| * Visualize a Node based on the analysis. |
| * |
| * @param t the node |
| * @param analysis the current analysis |
| * @return the String representation of the given node |
| */ |
| String visualizeBlockNode(Node t, @Nullable Analysis<V, S, T> analysis); |
| |
| /** Shutdown method called once from the shutdown hook of the {@code BaseTypeChecker}. */ |
| void shutdown(); |
| } |