soot.jimple.toolkits.pointer
Class LocalMustAliasAnalysis

java.lang.Object
  extended by soot.toolkits.scalar.AbstractFlowAnalysis<N,A>
      extended by soot.toolkits.scalar.FlowAnalysis<N,A>
          extended by soot.toolkits.scalar.ForwardFlowAnalysis<Unit,HashMap<Value,Object>>
              extended by soot.jimple.toolkits.pointer.LocalMustAliasAnalysis
Direct Known Subclasses:
StrongLocalMustAliasAnalysis

public class LocalMustAliasAnalysis
extends ForwardFlowAnalysis<Unit,HashMap<Value,Object>>

LocalMustAliasAnalysis attempts to determine if two local variables (at two potentially different program points) must point to the same object. The underlying abstraction is based on global value numbering. See also StrongLocalMustAliasAnalysis for an analysis that soundly treats redefinitions within loops. See Sable TR 2007-8 for details. P.S. The idea behind this analysis and the way it assigns numbers is very similar to what is described in the paper: Lapkowski, C. and Hendren, L. J. 1996. Extended SSA numbering: introducing SSA properties to languages with multi-level pointers. In Proceedings of the 1996 Conference of the Centre For Advanced Studies on Collaborative Research (Toronto, Ontario, Canada, November 12 - 14, 1996). M. Bauer, K. Bennet, M. Gentleman, H. Johnson, K. Lyons, and J. Slonim, Eds. IBM Centre for Advanced Studies Conference. IBM Press, 23. Only major differences: Here we only use primary numbers, no secondary numbers. Further, we use the call graph to determine fields that are not written to in the transitive closure of this method's execution. A third difference is that we assign fixed values to IdentityRefs, because those never change during one execution.

Author:
Patrick Lam, Eric Bodden
See Also:
StrongLocalMustAliasAnalysis

Field Summary
protected  SootMethod container
          the containing method
protected  Set<Value> localsAndFieldRefs
          The set of all local variables and field references that we track.
protected  Map<Unit,Map<Value,Integer>> mergePointToValueToNumber
          maps from a merge point (a unit) and a value to the unique value number of that value at this point
protected  int nextNumber
          the next value number
protected static Object NOTHING
           
protected  Map<Value,Integer> rhsToNumber
          maps from right-hand side expressions (non-locals) to value numbers
protected static Object UNKNOWN
           
static String UNKNOWN_LABEL
           
 
Fields inherited from class soot.toolkits.scalar.FlowAnalysis
filterUnitToAfterFlow, unitToAfterFlow
 
Fields inherited from class soot.toolkits.scalar.AbstractFlowAnalysis
filterUnitToBeforeFlow, graph, unitToBeforeFlow
 
Constructor Summary
LocalMustAliasAnalysis(UnitGraph g)
          Creates a new LocalMustAliasAnalysis tracking local variables.
LocalMustAliasAnalysis(UnitGraph g, boolean tryTrackFieldAssignments)
          Creates a new LocalMustAliasAnalysis.
 
Method Summary
protected  void copy(HashMap<Value,Object> sourceMap, HashMap<Value,Object> destMap)
          Creates a copy of the source flow object in dest.
protected  HashMap<Value,Object> entryInitialFlow()
          Initial most conservative value: has to be UNKNOWN (top).
protected  void flowThrough(HashMap<Value,Object> in, Unit u, HashMap<Value,Object> out)
          Given the merge of the out sets, compute the in set for s (or in to out, depending on direction).
 boolean hasInfoOn(Local l, Stmt s)
          Returns true if this analysis has any information about local l at statement s (i.e.
 String instanceKeyString(Local l, Stmt s)
          Returns a string (natural number) representation of the instance key associated with l at statement s or null if there is no such key associated or UNKNOWN if the value of l at s is UNKNOWN.
protected  void merge(HashMap<Value,Object> in1, HashMap<Value,Object> in2, HashMap<Value,Object> out)
          Compute the merge of the in1 and in2 sets, putting the result into out.
protected  void merge(Unit succUnit, HashMap<Value,Object> inMap1, HashMap<Value,Object> inMap2, HashMap<Value,Object> outMap)
          Merges in1 and in2 into out, just before node succNode.
 boolean mustAlias(Local l1, Stmt s1, Local l2, Stmt s2)
           
protected  HashMap<Value,Object> newInitialFlow()
          Initial bottom value: objects have no definitions.
static int parameterRefNumber(ParameterRef r)
           
static int thisRefNumber()
           
 
Methods inherited from class soot.toolkits.scalar.ForwardFlowAnalysis
constructWorklist, doAnalysis, isForward
 
Methods inherited from class soot.toolkits.scalar.FlowAnalysis
constructOrderer, getFlowAfter
 
Methods inherited from class soot.toolkits.scalar.AbstractFlowAnalysis
getFlowBefore, mergeInto, treatTrapHandlersAsEntries
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

UNKNOWN_LABEL

public static final String UNKNOWN_LABEL
See Also:
Constant Field Values

UNKNOWN

protected static final Object UNKNOWN

NOTHING

protected static final Object NOTHING

localsAndFieldRefs

protected Set<Value> localsAndFieldRefs
The set of all local variables and field references that we track. This set contains objects of type Local and, if tryTrackFieldAssignments is enabled, it may also contain EquivalentValues of FieldRefs. If so, these field references are to be tracked on the same way as Locals are.


rhsToNumber

protected transient Map<Value,Integer> rhsToNumber
maps from right-hand side expressions (non-locals) to value numbers


mergePointToValueToNumber

protected transient Map<Unit,Map<Value,Integer>> mergePointToValueToNumber
maps from a merge point (a unit) and a value to the unique value number of that value at this point


nextNumber

protected int nextNumber
the next value number


container

protected SootMethod container
the containing method

Constructor Detail

LocalMustAliasAnalysis

public LocalMustAliasAnalysis(UnitGraph g)
Creates a new LocalMustAliasAnalysis tracking local variables.


LocalMustAliasAnalysis

public LocalMustAliasAnalysis(UnitGraph g,
                              boolean tryTrackFieldAssignments)
Creates a new LocalMustAliasAnalysis. If tryTrackFieldAssignments, we run an interprocedural side-effects analysis to determine which fields are (transitively) written to by this method. All fields which that are not written to are tracked just as local variables. This semantics is sound for single-threaded programs.

Method Detail

merge

protected void merge(Unit succUnit,
                     HashMap<Value,Object> inMap1,
                     HashMap<Value,Object> inMap2,
                     HashMap<Value,Object> outMap)
Description copied from class: AbstractFlowAnalysis
Merges in1 and in2 into out, just before node succNode. By default, this method just calls merge(A,A,A), ignoring the node.

Overrides:
merge in class AbstractFlowAnalysis<Unit,HashMap<Value,Object>>

flowThrough

protected void flowThrough(HashMap<Value,Object> in,
                           Unit u,
                           HashMap<Value,Object> out)
Description copied from class: FlowAnalysis
Given the merge of the out sets, compute the in set for s (or in to out, depending on direction). This function often causes confusion, because the same interface is used for both forward and backward flow analyses. The first parameter is always the argument to the flow function (i.e. it is the "in" set in a forward analysis and the "out" set in a backward analysis), and the third parameter is always the result of the flow function (i.e. it is the "out" set in a forward analysis and the "in" set in a backward analysis).

Specified by:
flowThrough in class FlowAnalysis<Unit,HashMap<Value,Object>>

thisRefNumber

public static int thisRefNumber()

parameterRefNumber

public static int parameterRefNumber(ParameterRef r)

copy

protected void copy(HashMap<Value,Object> sourceMap,
                    HashMap<Value,Object> destMap)
Description copied from class: AbstractFlowAnalysis
Creates a copy of the source flow object in dest.

Specified by:
copy in class AbstractFlowAnalysis<Unit,HashMap<Value,Object>>

entryInitialFlow

protected HashMap<Value,Object> entryInitialFlow()
Initial most conservative value: has to be UNKNOWN (top).

Specified by:
entryInitialFlow in class AbstractFlowAnalysis<Unit,HashMap<Value,Object>>

newInitialFlow

protected HashMap<Value,Object> newInitialFlow()
Initial bottom value: objects have no definitions.

Specified by:
newInitialFlow in class AbstractFlowAnalysis<Unit,HashMap<Value,Object>>

instanceKeyString

public String instanceKeyString(Local l,
                                Stmt s)
Returns a string (natural number) representation of the instance key associated with l at statement s or null if there is no such key associated or UNKNOWN if the value of l at s is UNKNOWN.

Parameters:
l - any local of the associated method
s - the statement at which to check

hasInfoOn

public boolean hasInfoOn(Local l,
                         Stmt s)
Returns true if this analysis has any information about local l at statement s (i.e. it is not UNKNOWN). In particular, it is safe to pass in locals/statements that are not even part of the right method. In those cases false will be returned. Permits s to be null, in which case false will be returned.


mustAlias

public boolean mustAlias(Local l1,
                         Stmt s1,
                         Local l2,
                         Stmt s2)
Returns:
true if values of l1 (at s1) and l2 (at s2) have the exact same object IDs, i.e. at statement s1 the variable l1 must point to the same object as l2 at s2.

merge

protected void merge(HashMap<Value,Object> in1,
                     HashMap<Value,Object> in2,
                     HashMap<Value,Object> out)
Description copied from class: AbstractFlowAnalysis
Compute the merge of the in1 and in2 sets, putting the result into out. The behavior of this function depends on the implementation ( it may be necessary to check whether in1 and in2 are equal or aliased ). Used by the doAnalysis method.

Specified by:
merge in class AbstractFlowAnalysis<Unit,HashMap<Value,Object>>