Class ParameterImpl

java.lang.Object
ghidra.program.model.listing.ParameterImpl
All Implemented Interfaces:
Parameter, Variable, Comparable<Variable>
Direct Known Subclasses:
AutoParameterImpl, ReturnParameterImpl

public class ParameterImpl extends Object implements Parameter
Generic implementation of Parameter.
  • Field Details

    • ordinal

      protected int ordinal
  • Constructor Details

    • ParameterImpl

      public ParameterImpl(Parameter param, Program program) throws InvalidInputException
      Construct a parameter from another.
      Parameters:
      param - parameter to be copied
      program - target program
      Throws:
      InvalidInputException - if dataType restrictions are violated
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, Program program) throws InvalidInputException
      Construct a parameter which has no specific storage specified. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      program - target program
      Throws:
      InvalidInputException - if dataType restrictions are violated
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, Program program, SourceType sourceType) throws InvalidInputException
      Construct a parameter which has no specific storage specified. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      program - target program
      sourceType - name source type
      Throws:
      InvalidInputException - if dataType restrictions are violated
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, int stackOffset, Program program) throws InvalidInputException
      Construct a stack parameter at the specified stack offset. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      stackOffset - parameter stack offset
      program - target program
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage address is specified, or unable to resolve storage element for specified datatype
      AddressOutOfBoundsException - if invalid stack offset specified
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, int stackOffset, Program program, SourceType sourceType) throws InvalidInputException
      Construct a stack parameter at the specified stack offset. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      stackOffset - parameter stack offset
      program - target program
      sourceType - name source type
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage address is specified, or unable to resolve storage element for specified datatype
      AddressOutOfBoundsException - if invalid stack offset specified
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, Register register, Program program) throws InvalidInputException
      Construct a register parameter using the specified register. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      register - parameter register storage
      program - target program
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage address is specified, or unable to resolve storage element for specified datatype
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, Register register, Program program, SourceType sourceType) throws InvalidInputException
      Construct a register parameter using the specified register. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      register - parameter register storage
      program - target program
      sourceType - name source type
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage address is specified, or unable to resolve storage element for specified datatype
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, Address storageAddr, Program program) throws InvalidInputException
      Construct a parameter with a single storage element at the specified address. If address is contained within a register it may get realigned to the register based upon the resolved datatype length. Variable storage will be aligned to the least-significant portion of the register. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      storageAddr - storage address or null if no storage has been identified
      program - target program
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage address is specified, or unable to resolve storage element for specified datatype
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, Address storageAddr, Program program, SourceType sourceType) throws InvalidInputException
      Construct a parameter with a single storage element at the specified address. If address is contained within a register it may get realigned to the register based upon the resolved datatype length. Variable storage will be aligned to the least-significant portion of the register. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      storageAddr - storage address or null if no storage has been identified
      program - target program
      sourceType - name source type
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage address is specified, or unable to resolve storage element for specified datatype
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, VariableStorage storage, Program program) throws InvalidInputException
      Construct a parameter with one or more associated storage elements. Storage elements may get slightly modified to adjust for the resolved datatype size. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      storage - variable storage or null for unassigned storage
      program - target program
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage element is specified, or error while resolving storage element for specified datatype
    • ParameterImpl

      public ParameterImpl(String name, DataType dataType, VariableStorage storage, Program program, SourceType sourceType) throws InvalidInputException
      Construct a parameter with one or more associated storage elements. Storage elements may get slightly modified to adjust for the resolved datatype size. Ordinal assignment is not established (UNASSIGNED_ORDINAL).
      Parameters:
      name - variable name or null for default name
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      storage - variable storage or null for unassigned storage
      program - target program
      sourceType - name source type
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage element is specified, or error while resolving storage element for specified datatype
    • ParameterImpl

      public ParameterImpl(String name, int ordinal, DataType dataType, VariableStorage storage, boolean force, Program program, SourceType sourceType) throws InvalidInputException
      Construct a parameter with one or more associated storage elements. Storage elements may get slightly modified to adjust for the resolved datatype size.
      Parameters:
      name - variable name or null for default name
      ordinal - parameter ordinal (-1 for return ordinal)
      dataType - a fixed-length datatype. (NOTE: Should be cloned to program datatype manager prior to determining storage elements since their length may change)
      storage - variable storage or null for unassigned storage
      force - if true storage will be forced even if incorrect size
      program - target program
      sourceType - name source type
      Throws:
      InvalidInputException - if dataType restrictions are violated, an invalid storage element is specified, or error while resolving storage element for specified datatype
  • Method Details

    • hasDefaultName

      protected final boolean hasDefaultName()
      Determine if current name is a default name. This is more important for parameters so always returning false for locals is OK.
      Returns:
      true if name is reserved as a default name
    • getOrdinal

      public final int getOrdinal()
      Description copied from interface: Parameter
      Returns the ordinal (index) of this parameter within the function signature.
      Specified by:
      getOrdinal in interface Parameter
    • getFirstUseOffset

      public final int getFirstUseOffset()
      Specified by:
      getFirstUseOffset in interface Variable
      Returns:
      the first use offset relative to the function entry point.
    • getDataType

      public DataType getDataType()
      Description copied from interface: Variable
      Get the Data Type of this variable
      Specified by:
      getDataType in interface Variable
      Returns:
      the data type of the variable
    • getFormalDataType

      public DataType getFormalDataType()
      Description copied from interface: Parameter
      Get the original formal signature data type before a possible forced indirect was possibly imposed by the functions calling convention. The Variable.getDataType() method will always return the effective data type which corresponds to the allocated variable storage.
      Specified by:
      getFormalDataType in interface Parameter
      Returns:
      Formal data type. This type will only differ from the Variable.getDataType() value if this parameter isForcedIndirect.
    • isForcedIndirect

      public boolean isForcedIndirect()
      Description copied from interface: Parameter
      If this parameter which was forced by the associated calling convention to be passed as a pointer instead of its original formal type.
      Specified by:
      isForcedIndirect in interface Parameter
      Returns:
      true if this parameter was forced to be passed as a pointer instead of its original formal type
    • isAutoParameter

      public boolean isAutoParameter()
      Specified by:
      isAutoParameter in interface Parameter
      Returns:
      true if this parameter is automatically generated based upon the associated function calling convention and function signature. An example of such a parameter include the "__return_storage_ptr__" parameter.
    • getAutoParameterType

      public AutoParameterType getAutoParameterType()
      Description copied from interface: Parameter
      If this is an auto-parameter this method will indicate its type.
      Specified by:
      getAutoParameterType in interface Parameter
      Returns:
      auto-parameter type of null if not applicable.
    • isVoidAllowed

      protected boolean isVoidAllowed()
      Returns:
      true if a zero-sized void type is permitted
    • isValid

      public final boolean isValid()
      Description copied from interface: Variable
      Verify that the variable is valid (i.e., storage is valid and size matches variable data type size)
      Specified by:
      isValid in interface Variable
      Returns:
      true if variable is valid
    • getComment

      public final String getComment()
      Description copied from interface: Variable
      Get the Comment for this variable
      Specified by:
      getComment in interface Variable
      Returns:
      the comment
    • setDataType

      public void setDataType(DataType type, VariableStorage storage, boolean force, SourceType source) throws InvalidInputException
      Description copied from interface: Variable
      Set the Data Type of this variable and the associated storage whose size matches the data type length.

      NOTE: The storage and source are ignored if the function does not have custom storage enabled.

      Specified by:
      setDataType in interface Variable
      Parameters:
      type - the data type
      storage - properly sized storage for the new data type
      force - overwrite conflicting variables
      source - variable storage source (used only for function parameters and return)
      Throws:
      InvalidInputException - if data type is not a fixed length or violates storage constraints.
      VariableSizeException - if force is false and data type size causes a conflict with other variables
    • setDataType

      public final void setDataType(DataType type, boolean align, boolean force, SourceType source) throws InvalidInputException
      Description copied from interface: Variable
      Set the Data Type of this variable. The given dataType must have a fixed length.
      Specified by:
      setDataType in interface Variable
      Parameters:
      type - the data type
      align - maintain proper stack alignment/justification if supported by implementation. If false and this is a stack variable, the current stack address/offset will not change. If true, the affect is implementation dependent since alignment can not be performed without access to a compiler specification.
      force - overwrite conflicting variables
      source - signature source
      Throws:
      InvalidInputException - if data type is not a fixed length or violates storage constraints.
      VariableSizeException - if force is false and data type size causes a conflict with other variables
    • setDataType

      public void setDataType(DataType type, SourceType source) throws InvalidInputException
      Description copied from interface: Variable
      Set the Data Type of this variable using the default alignment behavior (implementation specific). The given dataType must have a fixed length. If contained within a stack-frame, data-type size will be constrained by existing variables (e.g., equivalent to force=false) Note: stack offset will be maintained for stack variables.
      Specified by:
      setDataType in interface Variable
      Parameters:
      type - the data type
      source - signature source
      Throws:
      InvalidInputException - if data type is not a fixed length or violates storage constraints.
      VariableSizeException - if data type size causes a conflict with other variables
      See Also:
    • getFunction

      public Function getFunction()
      Description copied from interface: Variable
      Returns the function that contains this Variable. May be null if the variable is not in a function.
      Specified by:
      getFunction in interface Variable
      Returns:
      containing function or null
    • getProgram

      public final Program getProgram()
      Description copied from interface: Variable
      Returns the program that contains this variable or is the intended target
      Specified by:
      getProgram in interface Variable
      Returns:
      the program.
    • getLength

      public final int getLength()
      Description copied from interface: Variable
      Get the length of this variable
      Specified by:
      getLength in interface Variable
      Returns:
      the length of the variable
    • getName

      public final String getName()
      Description copied from interface: Variable
      Get the Name of this variable or null if not assigned or not-applicable
      Specified by:
      getName in interface Variable
      Returns:
      the name of the variable
    • getSource

      public final SourceType getSource()
      Description copied from interface: Variable
      Get the source of this variable
      Specified by:
      getSource in interface Variable
      Returns:
      the source of this variable
    • getSymbol

      public final Symbol getSymbol()
      Specified by:
      getSymbol in interface Variable
      Returns:
      the symbol associated with this variable or null if no symbol associated. Certain dynamic variables such as auto-parameters do not have a symbol and will return null.
    • setComment

      public void setComment(String comment)
      Description copied from interface: Variable
      Set the comment for this variable
      Specified by:
      setComment in interface Variable
      Parameters:
      comment - the comment
    • setName

      public void setName(String name, SourceType source) throws InvalidInputException
      Description copied from interface: Variable
      Set the name of this variable.
      Specified by:
      setName in interface Variable
      Parameters:
      name - the name
      source - the source of this variable name
      Throws:
      InvalidInputException - if name contains blank characters, is zero length, or is null
    • hasAssignedStorage

      public final boolean hasAssignedStorage()
      Specified by:
      hasAssignedStorage in interface Variable
      Returns:
      true if this variable has been assigned storage. This is equivalent to Variable.getVariableStorage() != null
    • getVariableStorage

      public final VariableStorage getVariableStorage()
      Description copied from interface: Variable
      Get the variable storage associated with this variable.
      Specified by:
      getVariableStorage in interface Variable
      Returns:
      the variable storage for this variable
    • getFirstStorageVarnode

      public final Varnode getFirstStorageVarnode()
      Description copied from interface: Variable
      Get the first storage varnode for this variable
      Specified by:
      getFirstStorageVarnode in interface Variable
      Returns:
      the first storage varnode associated with this variable
      See Also:
    • getLastStorageVarnode

      public final Varnode getLastStorageVarnode()
      Description copied from interface: Variable
      Get the last storage varnode for this variable
      Specified by:
      getLastStorageVarnode in interface Variable
      Returns:
      the last storage varnode associated with this variable
      See Also:
    • isStackVariable

      public final boolean isStackVariable()
      Specified by:
      isStackVariable in interface Variable
      Returns:
      true if this is a simple variable consisting of a single stack varnode which will be returned by either the Variable.getFirstStorageVarnode() or Variable.getLastStorageVarnode() methods. The stack offset can be obtained using:
                      getFirstStorageVarnode().getOffset()
        
    • hasStackStorage

      public final boolean hasStackStorage()
      Specified by:
      hasStackStorage in interface Variable
      Returns:
      true if this variable uses simple or compound storage which contains a stack element. If true, the last storage varnode will always be the stack element.
      See Also:
    • isRegisterVariable

      public final boolean isRegisterVariable()
      Specified by:
      isRegisterVariable in interface Variable
      Returns:
      true if this is a simple variable consisting of a single register varnode which will be returned by either the Variable.getFirstStorageVarnode() or Variable.getLastStorageVarnode() methods. The register can be obtained using the Variable.getRegister() method.
    • getRegister

      public final Register getRegister()
      Specified by:
      getRegister in interface Variable
      Returns:
      first storage register associated with this variable, else null is returned. A variable with compound storage may have more than one register or other storage in addition to the register returned by this method.
      See Also:
    • getRegisters

      public final List<Register> getRegisters()
      Specified by:
      getRegisters in interface Variable
      Returns:
      all storage register(s) associated with this variable, else null is returned if no registers are used. A variable with compound storage may have more than one register or other storage in addition to the register(s) returned by this method.
      See Also:
    • getMinAddress

      public final Address getMinAddress()
      Specified by:
      getMinAddress in interface Variable
      Returns:
      the minimum address corresponding to the first varnode of this storage or null if this is a special empty storage: VariableStorage.BAD_STORAGE, VariableStorage.UNASSIGNED_STORAGE, VariableStorage.VOID_STORAGE
    • getStackOffset

      public final int getStackOffset()
      Specified by:
      getStackOffset in interface Variable
      Returns:
      the stack offset associated with simple stack variable (i.e., Variable.isStackVariable() returns true).
    • isMemoryVariable

      public final boolean isMemoryVariable()
      Specified by:
      isMemoryVariable in interface Variable
      Returns:
      true if this is a simple variable consisting of a single storage memory element which will be returned by either the Variable.getFirstStorageVarnode() or Variable.getVariableStorage() methods.
    • isUniqueVariable

      public final boolean isUniqueVariable()
      Specified by:
      isUniqueVariable in interface Variable
      Returns:
      true if this is a simple variable consisting of a single storage unique/hash element which will be returned by either the Variable.getFirstStorageVarnode() or Variable.getVariableStorage() methods. The unique hash can be obtained from the storage address offset corresponding to the single storage element.
    • isCompoundVariable

      public final boolean isCompoundVariable()
      Specified by:
      isCompoundVariable in interface Variable
      Returns:
      true if this variable uses compound storage consisting of two or more storage elements which will be returned by the Variable.getVariableStorage() method. Compound variables will always use a register(s) optionally followed by other storage (i.e., stack).
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • equals

      public final boolean equals(Object obj)
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • compareTo

      public final int compareTo(Variable otherVar)
      Specified by:
      compareTo in interface Comparable<Variable>
    • isEquivalent

      public final boolean isEquivalent(Variable otherVar)
      Description copied from interface: Variable
      Determine is another variable is equivalent to this variable.
      Specified by:
      isEquivalent in interface Variable
      Parameters:
      otherVar - other variable
      Returns:
      true if the specified variable is equivalent to this variable