/* * Bytecode Analysis Framework * Copyright (C) 2003-2007 University of Maryland * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package edu.umd.cs.findbugs.ba; import org.apache.bcel.generic.InstructionHandle; import edu.umd.cs.findbugs.annotations.CheckForNull; /** * A dataflow analysis to be used with the {@link Dataflow} class. * * <p> * In order to avoid duplicating functionality (such as caching of start and * result facts), most analyses should extend the * {@link BasicAbstractDataflowAnalysis} or {@link AbstractDataflowAnalysis} * classes rather than directly implementing this interface. * </p> * * @author David Hovemeyer * @see Dataflow */ public interface DataflowAnalysis<Fact> { /** * Create empty (uninitialized) dataflow facts for one program point. A * valid value will be copied into it before it is used. */ public Fact createFact(); /** * Get the start fact for given basic block. * * @param block * the basic block */ public Fact getStartFact(BasicBlock block); /** * Get the result fact for given basic block. * * @param block * the basic block */ public Fact getResultFact(BasicBlock block); /** * 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. * * @param location * the Location * @return the dataflow value at given Location * @throws DataflowAnalysisException */ public Fact getFactAtLocation(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. * * @param location * the Location * @return the dataflow value after given Location * @throws DataflowAnalysisException */ public Fact getFactAfterLocation(Location location) throws DataflowAnalysisException; /** * Get the fact that is true on the given control edge. * * @param edge * the edge * @return the fact that is true on the edge * @throws DataflowAnalysisException */ public Fact getFactOnEdge(Edge edge) throws DataflowAnalysisException; /** * Copy dataflow facts. */ public void copy(Fact source, Fact dest); /** * Initialize the "entry" fact for the graph. */ public void initEntryFact(Fact result) throws DataflowAnalysisException; /** * Make given fact the top value. */ public void makeFactTop(Fact fact); /** * Is the given fact the top value. */ public boolean isTop(Fact fact); /** * Returns true if the analysis is forwards, false if backwards. */ public boolean isForwards(); /** * Return the BlockOrder specifying the order in which BasicBlocks should be * visited in the main dataflow loop. * * @param cfg * the CFG upon which we're performing dataflow analysis */ public BlockOrder getBlockOrder(CFG cfg); /** * Are given dataflow facts the same? */ public boolean same(Fact fact1, Fact fact2); /** * Transfer function for the analysis. Taking dataflow facts at start (which * might be either the entry or exit of the block, depending on whether the * analysis is forwards or backwards), modify result to be the facts at the * other end of the block. * * @param basicBlock * the basic block * @param end * if nonnull, stop before considering this instruction; * otherwise, consider all of the instructions in the basic block * @param start * dataflow facts at beginning of block (if forward analysis) or * end of block (if backwards analysis) * @param result * resulting dataflow facts at other end of block */ public void transfer(BasicBlock basicBlock, @CheckForNull InstructionHandle end, Fact start, Fact result) throws DataflowAnalysisException; /** * Edge transfer function. Modify the given fact that is true on the * (logical) edge source to modify it so that it is true at the (logical) * edge target. * * <p> * A do-nothing implementation is legal, and appropriate for analyses where * branches are not significant. * </p> * * @param edge * the Edge * @param fact * a dataflow fact * @throws DataflowAnalysisException */ public void edgeTransfer(Edge edge, Fact fact) throws DataflowAnalysisException; /** * Meet a dataflow fact associated with an incoming edge into another fact. * This is used to determine the start fact for a basic block. * * @param fact * the predecessor fact (incoming edge) * @param edge * the edge from the predecessor * @param result * the result fact */ public void meetInto(Fact fact, Edge edge, Fact result) throws DataflowAnalysisException; /** * Called before beginning an iteration of analysis. Each iteration visits * every basic block in the CFG. */ public void startIteration(); /** * Called after finishing an iteration of analysis. */ public void finishIteration(); public int getLastUpdateTimestamp(Fact fact); public void setLastUpdateTimestamp(Fact fact, int timestamp); /** * Return a String representation of given Fact. For debugging purposes. * * @param fact * a dataflow fact * @return String representation of the fact */ public String factToString(Fact fact); } // vim:ts=4