Class AndroidModelParameterManager


  • public class AndroidModelParameterManager
    extends Object
    Manages SSA-Numbers for the arguments to Entrypoints. This class comes in handy if you want to use loops or mix a return value of a function into the parameter of a later function. It supports multiple levels of cascading code blocks and delivers information which SSA-Value is the latest to use or which aught to be combined using a Phi-Statement.

    However it does no allocations or Phi-Statements on its own. It just juggles with the numbers.

    Since:
    2013-09-19 TODO:
    See Also:
    AbstractAndroidModel, DexFakeRootMethod
    • Constructor Detail

      • AndroidModelParameterManager

        public AndroidModelParameterManager​(IInstantiationBehavior behaviour)
        Setting the behaviour may be handy in the later model. However it brings no benefit to the AndroidModelParameterManager.
      • AndroidModelParameterManager

        public AndroidModelParameterManager​(MethodReference mRef,
                                            boolean isStatic)
      • AndroidModelParameterManager

        public AndroidModelParameterManager​(ParameterAccessor acc)
    • Method Detail

      • setAllocation

        public void setAllocation​(TypeReference type,
                                  int ssaValue,
                                  SSAInstruction setBy)
        Register a variable _after_ allocation. The proper way to add an allocation is to get a Variable using getUnallocated(com.ibm.wala.types.TypeReference). Then assign it a value. And at last call this function. You can however directly call the function if the type has not been seen before.
        Parameters:
        type - The type allocated
        ssaValue - an unallocated SSA-Variable to assign the allocation to
        setBy - The instruction that set the value
        Throws:
        IllegalStateException - if you set more than one allocation for that type (TODO better check!)
        IllegalArgumentException - if type is null or ssaValue is zero or negative
      • setAllocation

        public void setAllocation​(TypeReference type,
                                  int ssaValue)
      • setAllocation

        public void setAllocation​(SSAValue val)
      • setPhi

        public void setPhi​(TypeReference type,
                           int ssaValue,
                           SSAInstruction setBy)
        Register a Phi-Instruction _after_ added to the model.
        Parameters:
        type - the type the Phi-Instruction sets
        ssaValue - the number the SSA-Instruction assignes to
        setBy - the Phi-Instruction itself - may be null
        Throws:
        IllegalArgumentException - if you assign to a number requested using getFree(TypeReference) but types mismach.
        IllegalStateException - if you forgot to close some Phis
      • getFree

        public int getFree​(TypeReference type)
        Returns and registers a free SSA-Number to a Type. You have to set the type using a Phi-Instruction. Also you don't have to add that instruction immediatly it is required that it is added before the Model gets finished. You can request the List of unmet Phi-Instructions by using XXX
        Returns:
        an unused SSA-Number
        Throws:
        IllegalArgumentException - if type is null
      • getUnallocated

        public int getUnallocated​(TypeReference type)
        Get an unused number to assign to. There may only be one unallocated value for each type at a time. XXX: Really?
        Returns:
        SSA-Variable
        Throws:
        IllegalStateException - if there is already an unallocated variable of that type
        IllegalArgumentException - if type is null
      • getUnmanaged

        public int getUnmanaged()
        Retreive a SSA-Value that is not under management. Use instead of 'nextLocal++', else SSA-Values will clash!
        Returns:
        SSA-Variable
      • getCurrent

        public int getCurrent​(TypeReference type)
        Retreive the SSA-Number that is valid for a type in the current scope. Either that number origins from an allocation or a PhiInstruction (to be).
        Returns:
        a ssa number
        Throws:
        IllegalStateException - if no number is assignable
        IllegalArgumentException - if type was not seen before or is null
      • getSuper

        public int getSuper​(TypeReference type)
        Retreive the SSA-Number that is valid for a type in the super-ordinate scope. Either that number origins from an allocation or a PhiInstruction (to be).
        Returns:
        a ssa number
        Throws:
        IllegalStateException - if no number is assignable
        IllegalArgumentException - if type was not seen before or is null
      • isSeen

        public boolean isSeen​(TypeReference type,
                              boolean withSuper)
        Return if the type is managed by this class.
        Parameters:
        withSuper - when true return true if a managed key may be cast to type, when false type has to match exactly
        type - the type in question
        Throws:
        IllegalArgumentException - if type is null
      • needsAllocation

        public boolean needsAllocation​(TypeReference type)
        Returns if an instance for that type needs to be allocated. However this function does not respect weather a PhiInstruction is needed.
        Throws:
        IllegalArgumentException - if type is null
      • needsPhi

        public boolean needsPhi​(TypeReference type)
        Returns if a PhiInstruction (still) has to be added. This is true if the Value has changed in a deeper scope, has been invalidated or requested using getFree
        Throws:
        IllegalArgumentException - if type is null or has not been seen before
      • scopeDown

        public int scopeDown​(boolean doesLoop)
        Enter a subordinate scope. Call this whenever a new code block starts i.e. when ever you would have to put a left curly-bracket in yout java code.

        This function influences the placement of Phi-Functions. Thus if you don't change values you don't have to call it.

        Parameters:
        doesLoop - set to true if the scope is introduced for a loop
        Returns:
        The depth
      • scopeUp

        public int scopeUp()
        Leave a subordinate scope. All changes are marked invalid thus to be expected to be collected by a PhiInstruction.
        Throws:
        IllegalStateException - if already at top level
      • isReuse

        public boolean isReuse​(TypeReference type)
        Handed through to an IInstantiationBehavior if set in the constructor.
        Returns:
        true if Type is a REUSE type
        Throws:
        IllegalStateExcpetion - if AndroidModelParameterManager was constructed without an IInstanciationBehavior
      • isCreate

        public boolean isCreate​(TypeReference type)
        Shorthand for not(isReuse(TypeReference).
        Returns:
        true if type is a CREATE-Type
        Throws:
        IllegalStateExcpetion - if AndroidModelParameterManager was constructed without an IInstanciationBehavior