>Hex-Rays - IDA Page

IDA Pro Union Tutorial

Suppose the source text looked like this:

#include 

union urecord_t
{
  char c;
  short s;
  long l;
};

struct record_t
{
  int type;
#define RTYPE_CHAR      0
#define RTYPE_SHORT     1
#define RTYPE_LONG      2
  urecord_t u;
};

bool is_negative(record_t *r)
{
  switch ( r->type )
  {
    case RTYPE_CHAR:  return r->u.c < 0;
    case RTYPE_SHORT: return r->u.s < 0;
    case RTYPE_LONG:  return r->u.l < 0;
  }
  abort();
}

we have a disassembly like this:




Let's improve it with unions. First, let's define an union type. Since Unions are a special case of structures, we open a structure window (menu View|Structures), press Ins to create an union. Do not check "Create Union"

 

We create the union members using the regular data definition commands. (press D repeatedly to define a field, N to rename it) we obtain :

urecord_t union ; (sizeof=0x4) chr
db ? shrt
dw ?
lng dd ?
urecord_t ends;

-----------------------------------

record_t struc ; (sizeof=0x8)
type dd ?
u urecord_t ?
record_t ends

Switching to the disassembly window (or closing the enumeration window with Alt-F3), we apply the defined structure through the Edit|Operand types|Struct offset menu item and select the proper representation for the operand. In the union type case, it may be necessary to select the desired union member with the Edit|Structs|Select union member command. The final disassembly looks like this:

 

 

That's all folks !

 


[Go Back to >Hex-Rays Home Page ]
Hex-Rays cour Saint Remy 10g Liège (Belgium)
tel 32-4-222-4300 fax 32-4-222-6500
Please send us your questions or comments.