cexpr_t Struct Reference

Ctree element: expression. More...

Inheritance diagram for cexpr_t:
citem_t carg_t

Public Member Functions

bool cpadone (void) const
 Pointer arithmetic correction done for this expression?
 
bool is_odd_lvalue (void) const
 
bool is_fpop (void) const
 
bool is_cstr (void) const
 
bool is_type_partial (void) const
 
void set_cpadone (void)
 
void set_type_partial (void)
 
 cexpr_t (ctype_t cop, cexpr_t *_x)
 
 cexpr_t (ctype_t cop, cexpr_t *_x, cexpr_t *_y)
 
 cexpr_t (ctype_t cop, cexpr_t *_x, cexpr_t *_y, cexpr_t *_z)
 
 cexpr_t (mbl_array_t *mba, const lvar_t &v)
 
 cexpr_t (const cexpr_t &r)
 
void swap (cexpr_t &r)
 
cexpr_toperator= (const cexpr_t &r)
 
cexpr_tassign (const cexpr_t &r)
 
 DECLARE_COMPARISONS (cexpr_t)
 
void replace_by (cexpr_t *r)
 Replace the expression. More...
 
void cleanup (void)
 Cleanup the expression. More...
 
void put_number (cfunc_t *func, uint64 value, int nbytes, type_sign_t sign=no_sign)
 Assign a number to the expression. More...
 
void print1 (qstring *vout, const cfunc_t *func) const
 Print expression into one line. More...
 
void calc_type (bool recursive)
 Calculate the type of the expression. More...
 
bool equal_effect (const cexpr_t &r) const
 Compare two expressions. More...
 
bool is_child_of (const citem_t *parent) const
 Verify if the specified item is our parent. More...
 
bool contains_operator (ctype_t needed_op, int times=1) const
 Check if the expression contains the specified operator. More...
 
bool contains_expr (const cexpr_t *e) const
 Does the expression contain another expression?
 
bool contains_comma (int times=1) const
 Does the expression contain a comma operator?
 
bool contains_insn (int times=1) const
 Does the expression contain an embedded statement operator?
 
bool contains_insn_or_label (void) const
 Does the expression contain an embedded statement operator or a label?
 
bool contains_comma_or_insn_or_label (int maxcommas=1) const
 Does the expression contain a comma operator or an embedded statement operator or a label?
 
bool is_nice_expr (void) const
 Is nice expression? Nice expressions do not contain comma operators, embedded statements, or labels. More...
 
bool is_nice_cond (void) const
 Is nice condition?. More...
 
bool is_call_object_of (const citem_t *parent) const
 Is call object? More...
 
bool is_call_arg_of (const citem_t *parent) const
 Is call argument? More...
 
type_sign_t get_type_sign (void) const
 Get expression sign.
 
bool is_type_unsigned (void) const
 Is expression unsigned?
 
bool is_type_signed (void) const
 Is expression signed?
 
int get_high_nbit_bound (int pbits, type_sign_t psign, bool *p_maybe_negative=NULL) const
 Get max number of bits that can really be used by the expression. More...
 
int get_low_nbit_bound (type_sign_t psign, bool *p_maybe_negative=NULL) const
 Get min number of bits that are always present in the expression. More...
 
bool requires_lvalue (const cexpr_t *child) const
 Check if the expression requires an lvalue. More...
 
bool has_side_effects (void) const
 Check if the expression has side effects. More...
 
bool is_aliasable (void) const
 Check if the expression if aliasable. More...
 
uint64 numval (void) const
 Get numeric value of the expression. More...
 
bool is_const_value (uint64 _v) const
 Check if the expression is a number with the specified value.
 
bool is_negative_const (void) const
 Check if the expression is a negative number.
 
bool is_non_zero_const (void) const
 Check if the expression is a non-zero number.
 
bool is_zero_const (void) const
 Check if the expression is a zero.
 
bool is_value_used (const citem_t *parent) const
 Does the PARENT need the expression value.
 
bool get_const_value (uint64 *out) const
 Get expression value. More...
 
bool maybe_ptr (void) const
 May the expression be a pointer?
 
cexpr_tget_ptr_or_array (void)
 Find pointer or array child.
 
const cexpr_tfind_op (ctype_t _op) const
 Find the child with the specified operator.
 
cexpr_tfind_op (ctype_t _op)
 
const cexpr_tfind_num_op (void) const
 Find the operand with a numeric value.
 
cexpr_tfind_num_op (void)
 
const cexpr_tfind_ptr_or_array (bool remove_eqsize_casts) const
 Find the pointer operand. More...
 
const cexpr_ttheother (const cexpr_t *what) const
 Get the other operand. More...
 
cexpr_ttheother (const cexpr_t *what)
 
bool get_1num_op (cexpr_t **o1, cexpr_t **o2)
 Get pointers to operands. More...
 
bool get_1num_op (const cexpr_t **o1, const cexpr_t **o2) const
 
- Public Member Functions inherited from citem_t
 citem_t (ctype_t o)
 
void swap (citem_t &r)
 Swap two citem_t.
 
bool is_expr (void) const
 Is an expression?
 
bool contains_label (void) const
 Does the item contain a label?
 
const citem_tfind_parent_of (const citem_t *sitem) const
 Find parent of the specified item. More...
 
citem_tfind_parent_of (const citem_t *item)
 
citem_tfind_closest_addr (ea_t _ea)
 
void print1 (qstring *vout, const cfunc_t *func) const
 Print item into one line. More...
 

Public Attributes

union {
   cnumber_t *   n
 used for cot_num
 
   fnumber_t *   fpc
 used for cot_fnum
 
   struct {
      union {
         var_ref_t   v
 used for cot_var
 
         ea_t   obj_ea
 used for cot_obj
 
      } 
 
      int   refwidth
 how many bytes are accessed? (-1: none)
 
   } 
 
   struct {
      cexpr_t *   x
 the first operand of the expression
 
      union {
         cexpr_t *   y
 the second operand of the expression
 
         carglist_t *   a
 argument list (used for cot_call)
 
         uint32   m
 member offset (used for cot_memptr, cot_memref) for unions, the member number
 
      } 
 
      union {
         cexpr_t *   z
 the third operand of the expression
 
         int   ptrsize
 memory access size (used for cot_ptr, cot_memptr)
 
      } 
 
   } 
 
   cinsn_t *   insn
 an embedded statement, they are prohibited at the final maturity stage (CMAT_FINAL)
 
   char *   helper
 helper name (used for cot_helper)
 
   char *   string
 string constant (used for cot_str)
 
}; 
 
tinfo_t type
 expression type. must be carefully maintained
 
int exflags
 Expression attributes
 
- Public Attributes inherited from citem_t
ea_t ea
 address that corresponds to the item
 
ctype_t op
 element type
 
int label_num
 label number. More...
 
int index
 item index. meaningful only after print_func()
 

Detailed Description

Ctree element: expression.

Depending on the exact expression item type, various fields of this structure are used.

Examples:
hexrays_sample2.cpp, hexrays_sample3.cpp, and hexrays_sample5.cpp.

Definition at line 3663 of file hexrays.hpp.

Member Function Documentation

◆ calc_type()

void cexpr_t::calc_type ( bool  recursive)

Calculate the type of the expression.

Use this function to calculate the expression type when a new expression is built

Parameters
recursiveif true, types of all children expression will be calculated before calculating our type

Definition at line 8487 of file hexrays.hpp.

References hexdsp.

◆ cleanup()

void cexpr_t::cleanup ( void  )

Cleanup the expression.

This function properly deletes all children and sets the item type to cot_empty.

Definition at line 8469 of file hexrays.hpp.

References hexdsp.

◆ contains_operator()

bool cexpr_t::contains_operator ( ctype_t  needed_op,
int  times = 1 
) const

Check if the expression contains the specified operator.

Parameters
needed_opoperator code to search for
timeshow many times the operator code should be present
Returns
true if the expression has at least TIMES children with NEEDED_OP

Definition at line 8505 of file hexrays.hpp.

References hexdsp.

◆ equal_effect()

bool cexpr_t::equal_effect ( const cexpr_t r) const

Compare two expressions.

This function tries to compare two expressions in an 'intelligent' manner. For example, it knows about commutitive operators and can ignore useless casts.

Parameters
rthe expression to compare against the current expression
Returns
true expressions can be considered equal

Definition at line 8493 of file hexrays.hpp.

References hexdsp.

◆ find_ptr_or_array()

const cexpr_t* cexpr_t::find_ptr_or_array ( bool  remove_eqsize_casts) const

Find the pointer operand.

This function returns the pointer operand for binary expressions.

◆ get_1num_op()

bool cexpr_t::get_1num_op ( cexpr_t **  o1,
cexpr_t **  o2 
)

Get pointers to operands.

at last one operand should be a number o1 will be pointer to the number

Definition at line 4731 of file hexrays.hpp.

References cot_num.

◆ get_const_value()

bool cexpr_t::get_const_value ( uint64 *  out) const

Get expression value.

Parameters
outPointer to the variable where the expression value is returned.
Returns
true if the expression is a number.

Definition at line 3854 of file hexrays.hpp.

References cot_num.

◆ get_high_nbit_bound()

int cexpr_t::get_high_nbit_bound ( int  pbits,
type_sign_t  psign,
bool *  p_maybe_negative = NULL 
) const

Get max number of bits that can really be used by the expression.

For example, x % 16 can yield only 4 non-zero bits

Definition at line 8511 of file hexrays.hpp.

References hexdsp.

◆ get_low_nbit_bound()

int cexpr_t::get_low_nbit_bound ( type_sign_t  psign,
bool *  p_maybe_negative = NULL 
) const

Get min number of bits that are always present in the expression.

For example, 16 always uses 5 bits.

Definition at line 8517 of file hexrays.hpp.

References hexdsp.

◆ has_side_effects()

bool cexpr_t::has_side_effects ( void  ) const

Check if the expression has side effects.

Calls, pre/post inc/dec, and assignments have side effects.

Definition at line 8529 of file hexrays.hpp.

References hexdsp.

◆ is_aliasable()

bool cexpr_t::is_aliasable ( void  ) const

Check if the expression if aliasable.

Simple registers and non-aliasble stack slots return false.

◆ is_call_arg_of()

bool cexpr_t::is_call_arg_of ( const citem_t parent) const

Is call argument?

Returns
true if our expression is a call argument of the specified parent expression.

Definition at line 3802 of file hexrays.hpp.

References cot_call, and citem_t::op.

◆ is_call_object_of()

bool cexpr_t::is_call_object_of ( const citem_t parent) const

Is call object?

Returns
true if our expression is the call object of the specified parent expression.

Definition at line 3799 of file hexrays.hpp.

References cot_call, and citem_t::op.

◆ is_child_of()

bool cexpr_t::is_child_of ( const citem_t parent) const

Verify if the specified item is our parent.

Parameters
parentpossible parent item
Returns
true if the specified item is our parent

Definition at line 8499 of file hexrays.hpp.

References hexdsp.

◆ is_nice_cond()

bool cexpr_t::is_nice_cond ( void  ) const

Is nice condition?.

Nice condition is a nice expression of the boolean type.

Definition at line 3796 of file hexrays.hpp.

◆ is_nice_expr()

bool cexpr_t::is_nice_expr ( void  ) const

Is nice expression? Nice expressions do not contain comma operators, embedded statements, or labels.

Definition at line 3793 of file hexrays.hpp.

◆ numval()

uint64 cexpr_t::numval ( void  ) const

Get numeric value of the expression.

This function can be called only on cot_num expressions!

Definition at line 3827 of file hexrays.hpp.

References cot_num.

◆ print1()

void cexpr_t::print1 ( qstring *  vout,
const cfunc_t func 
) const

Print expression into one line.

Parameters
voutoutput buffer
funcparent function. This argument is used to find out the referenced variable names.
Examples:
hexrays_sample5.cpp.

Definition at line 8481 of file hexrays.hpp.

References hexdsp.

◆ put_number()

void cexpr_t::put_number ( cfunc_t func,
uint64  value,
int  nbytes,
type_sign_t  sign = no_sign 
)

Assign a number to the expression.

Parameters
funccurrent function
valuenumber value
nbytessize of the number in bytes
signnumber sign

Definition at line 8475 of file hexrays.hpp.

References hexdsp.

◆ replace_by()

void cexpr_t::replace_by ( cexpr_t r)

Replace the expression.

The children of the expression are abandoned (not freed). The expression pointed by 'r' is moved to 'this' expression

Parameters
rthe source expression. It is deleted after being copied

Definition at line 8463 of file hexrays.hpp.

References hexdsp.

◆ requires_lvalue()

bool cexpr_t::requires_lvalue ( const cexpr_t child) const

Check if the expression requires an lvalue.

Parameters
childThe function will check if this child of our expression must be an lvalue.
Returns
true if child must be an lvalue.

Definition at line 8523 of file hexrays.hpp.

References hexdsp.

◆ theother()

const cexpr_t* cexpr_t::theother ( const cexpr_t what) const

Get the other operand.

This function returns the other operand (not the specified one) for binary expressions.

Definition at line 3907 of file hexrays.hpp.