[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

LocalDefs and FlowAnalysis documentation bugs



Hi,

I think I've found a couple more bugs in the API. I've attached a patch that fixes both of them, although there might be better ways to do it (as was the case with FlowSet.java).

First, LocalUses says it returns a List of Units, whereas in reality both implementations of this interface return a List of UnitValueBoxPairs. Also, SimpleLocalUses says it returns a UnitValueBoxPair, but it returns a List of them.

Second, at line 139 of BackwardFlowAnalysis.java:

flowThrough(afterFlow, s, beforeFlow);

which says that the afterFlow is the IN set and the beforeFlow is the OUT set.

And at line 159 of ForwardFlowAnalysis.java:

flowThrough(beforeFlow, s, afterFlow);

which says that the beforeFlow is the IN set and the afterFlow is the OUT set.

(okay, there are other places to see it, but that seems clearest)

However, the documentation says that getFlowBefore(s) returns the IN set and getFlowAfter(s) returns the OUT set, and makes no mention of direction. I had assumed until now that "before" always meant "in" and "after" always mean "out", and only just caught this bug in my analyses. If I'm wrong, then I've seriously misunderstood something here, and would still appreciate an explanation.

I'm not sure, but it might be worth checking through all BackwardFlowAnalysis subclasses and their clients to see that they understand before and after correctly.

Thanks,
Chris

Index: src/soot/toolkits/scalar/FlowAnalysis.java
===================================================================
--- src/soot/toolkits/scalar/FlowAnalysis.java	(revision 1518)
+++ src/soot/toolkits/scalar/FlowAnalysis.java	(working copy)
@@ -53,7 +53,9 @@
     /** Given the merge of the <code>out</code> sets, compute the <code>in</code> set for <code>s</code> (or in to out, depending on direction). */
     protected abstract void flowThrough(Object in, Object d, Object out);
 
-    /** Accessor function returning value of OUT set for s. */
+    /** Accessor function returning value of OUT set for s if s is a
+     *  ForwardFlowAnalysis, and the IN set for s if s is a
+     *  BackwardFlowAnalysis. */
     public Object getFlowAfter(Object s)
     {
         return unitToAfterFlow.get(s);
Index: src/soot/toolkits/scalar/AbstractFlowAnalysis.java
===================================================================
--- src/soot/toolkits/scalar/AbstractFlowAnalysis.java	(revision 1518)
+++ src/soot/toolkits/scalar/AbstractFlowAnalysis.java	(working copy)
@@ -96,7 +96,10 @@
      * Typically called from a concrete FlowAnalysis's constructor.*/
     protected abstract void doAnalysis();
 
-    /** Accessor function returning value of IN set for s. */
+
+    /** Accessor function returning value of IN set for s if s is a
+     *  ForwardFlowAnalysis, and the OUT set for s if s is a
+     *  BackwardFlowAnalysis. */
     public Object getFlowBefore(Object s)
     {
         return unitToBeforeFlow.get(s);
Index: src/soot/toolkits/scalar/SimpleLocalUses.java
===================================================================
--- src/soot/toolkits/scalar/SimpleLocalUses.java	(revision 1518)
+++ src/soot/toolkits/scalar/SimpleLocalUses.java	(working copy)
@@ -162,7 +162,7 @@
      *  a list of UnitValueBoxPairs each containing a Unit that use the
      *  local and the Local itself wrapped in a ValueBox.
      *  @param s a unit that we want to query for the uses of the Local it (may) define.
-     *  @return a UnitValueBoxPair of the Units that use the Local.
+     *  @return a List of UnitValueBoxPairs of the Units that use the Local.
      */
     public List getUsesOf(Unit s)
     {
Index: src/soot/toolkits/scalar/LocalUses.java
===================================================================
--- src/soot/toolkits/scalar/LocalUses.java	(revision 1518)
+++ src/soot/toolkits/scalar/LocalUses.java	(working copy)
@@ -42,25 +42,13 @@
 public interface LocalUses
 {
     /**
-     *   Returns a list of the Units that use the Local that is 
-     *   defined by a given Unit. 
-     *   
-     *   @param s  the unit we wish to query for the use of the Local
-     *             it defines.
-     *   @return  a list of the Local's uses.
-     */    
+     * Uses for a Local defined at a given Unit are returned as a list
+     * of UnitValueBoxPairs each containing a Unit that use the local
+     * and the Local itself wrapped in a ValueBox.
+     * 
+     *  @param s a unit that we want to query for the uses of the
+     *           Local it (may) define.
+     *  @return a List of UnitValueBoxPairs of the Units that use the Local.
+     */
     public List getUsesOf(Unit s);
 }
-
-
-
-
-
-
-
-
-
-
-
-
-