Rizin
unix-like reverse engineering framework and cli tools
cond.c File Reference
#include <rz_analysis.h>

Go to the source code of this file.

Functions

RZ_API RzAnalysisCondrz_analysis_cond_new (void)
 
RZ_API void rz_analysis_cond_fini (RzAnalysisCond *c)
 
RZ_API void rz_analysis_cond_free (RzAnalysisCond *c)
 
RZ_API RzAnalysisCondrz_analysis_cond_clone (RzAnalysisCond *cond)
 
static const char * condstring (RzAnalysisCond *cond)
 
RZ_API int rz_analysis_cond_eval (RzAnalysis *analysis, RzAnalysisCond *cond)
 
RZ_API char * rz_analysis_cond_to_string (RzAnalysisCond *cond)
 
RZ_API RzAnalysisCondrz_analysis_cond_new_from_op (RzAnalysisOp *op)
 
RZ_API RzAnalysisCondrz_analysis_cond_new_from_string (const char *str)
 

Function Documentation

◆ condstring()

static const char* condstring ( RzAnalysisCond cond)
inlinestatic

Definition at line 37 of file cond.c.

37  {
38  const char *condstr_single[] = { "!", "", "0<", "0<=", "0>", "0>=" };
39  const char *condstr[] = { "==", "!=", ">=", ">", "<=", "<" };
40  if (cond) {
41  if (cond->arg[1]) {
42  return condstr[cond->type % 6];
43  } else {
44  return condstr_single[cond->type % 6];
45  }
46  }
47  return "";
48 }
#define cond(bop, top, mask, flags)

References cond.

Referenced by rz_analysis_cond_to_string().

◆ rz_analysis_cond_clone()

RZ_API RzAnalysisCond* rz_analysis_cond_clone ( RzAnalysisCond cond)

Definition at line 28 of file cond.c.

28  {
30  if (!c) {
31  return NULL;
32  }
33  memcpy(c, cond, sizeof(RzAnalysisCond));
34  return c;
35 }
#define NULL
Definition: cris-opc.c:27
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
#define RZ_NEW(x)
Definition: rz_types.h:285
#define c(i)
Definition: sha256.c:43

References c, cond, memcpy(), NULL, and RZ_NEW.

◆ rz_analysis_cond_eval()

RZ_API int rz_analysis_cond_eval ( RzAnalysis analysis,
RzAnalysisCond cond 
)

Definition at line 50 of file cond.c.

50  {
51  // XXX: sign issue here?
52  st64 arg0 = (st64)rz_analysis_value_to_ut64(analysis, cond->arg[0]);
53  if (cond->arg[1]) {
54  st64 arg1 = (st64)rz_analysis_value_to_ut64(analysis, cond->arg[1]);
55  return rz_type_cond_eval(cond->type, arg0, arg1);
56  } else {
57  return rz_type_cond_eval_single(cond->type, arg0);
58  }
59  return false;
60 }
RZ_API ut64 rz_analysis_value_to_ut64(RzAnalysis *analysis, RzAnalysisValue *val)
Definition: value.c:41
RZ_API bool rz_type_cond_eval_single(RzTypeCond cond, st64 arg0)
Same as rz_type_cond_eval, but it assumes arg1 to be 0.
Definition: helpers.c:554
RZ_API bool rz_type_cond_eval(RzTypeCond cond, st64 arg0, st64 arg1)
evaluate the type condition on the arguments and return a bool accordingly.
Definition: helpers.c:534
#define st64
Definition: rz_types_base.h:10

References cond, rz_analysis_value_to_ut64(), rz_type_cond_eval(), rz_type_cond_eval_single(), and st64.

◆ rz_analysis_cond_fini()

RZ_API void rz_analysis_cond_fini ( RzAnalysisCond c)

Definition at line 10 of file cond.c.

10  {
11  if (!c) {
12  return;
13  }
14  rz_analysis_value_free(c->arg[0]);
15  rz_analysis_value_free(c->arg[1]);
16  c->arg[0] = c->arg[1] = NULL;
17 }
RZ_API void rz_analysis_value_free(RzAnalysisValue *value)
Definition: value.c:29

References c, NULL, and rz_analysis_value_free().

Referenced by rz_analysis_cond_free().

◆ rz_analysis_cond_free()

RZ_API void rz_analysis_cond_free ( RzAnalysisCond c)

Definition at line 19 of file cond.c.

19  {
20  if (!c) {
21  return;
22  }
24  free(c);
25 }
RZ_API void rz_analysis_cond_fini(RzAnalysisCond *c)
Definition: cond.c:10
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130

References c, free(), and rz_analysis_cond_fini().

Referenced by block_free(), and run_basic_block_analysis().

◆ rz_analysis_cond_new()

RZ_API RzAnalysisCond* rz_analysis_cond_new ( void  )

Definition at line 6 of file cond.c.

6  {
7  return RZ_NEW0(RzAnalysisCond);
8 }
#define RZ_NEW0(x)
Definition: rz_types.h:284

References RZ_NEW0.

Referenced by rz_analysis_cond_new_from_op().

◆ rz_analysis_cond_new_from_op()

RZ_API RzAnalysisCond* rz_analysis_cond_new_from_op ( RzAnalysisOp op)

Definition at line 92 of file cond.c.

92  {
94  if (!(cond = rz_analysis_cond_new())) {
95  return NULL;
96  }
97  // v->reg[0] = op->src[0];
98  // v->reg[1] = op->src[1];
99  cond->arg[0] = op->src[0];
100  op->src[0] = NULL;
101  cond->arg[1] = op->src[1];
102  op->src[1] = NULL;
103  // TODO: moar!
104  // cond->arg[1] = op->src[1];
105  return cond;
106 }
RZ_API RzAnalysisCond * rz_analysis_cond_new(void)
Definition: cond.c:6
Definition: dis.c:32

References cond, NULL, and rz_analysis_cond_new().

Referenced by run_basic_block_analysis().

◆ rz_analysis_cond_new_from_string()

RZ_API RzAnalysisCond* rz_analysis_cond_new_from_string ( const char *  str)

Definition at line 108 of file cond.c.

108  {
110  // TODO: find '<','=','>','!'...
111  return cond;
112 }

References cond, and RZ_NEW.

◆ rz_analysis_cond_to_string()

RZ_API char* rz_analysis_cond_to_string ( RzAnalysisCond cond)

Definition at line 63 of file cond.c.

63  {
64  char *val0, *val1, *out = NULL;
65  const char *cnd;
66  if (!cond) {
67  return NULL;
68  }
69  cnd = condstring(cond);
70  val0 = rz_analysis_value_to_string(cond->arg[0]);
71  val1 = rz_analysis_value_to_string(cond->arg[1]);
72  if (val0) {
74  int val0len = strlen(val0) + 10;
75  if ((out = malloc(val0len))) {
76  snprintf(out, val0len, "%s%s", cnd, val0);
77  }
78  } else {
79  if (val1) {
80  int val0len = strlen(val0) + strlen(val1) + 10;
81  if ((out = malloc(val0len))) {
82  snprintf(out, val0len, "%s %s %s", val0, cnd, val1);
83  }
84  }
85  }
86  }
87  free(val0);
88  free(val1);
89  return out ? out : strdup("?");
90 }
RZ_API char * rz_analysis_value_to_string(RzAnalysisValue *value)
Definition: value.c:83
const lzma_allocator const uint8_t size_t uint8_t * out
Definition: block.h:528
static const char * condstring(RzAnalysisCond *cond)
Definition: cond.c:37
snprintf
Definition: kernel.h:364
void * malloc(size_t size)
Definition: malloc.c:123
return strdup("=SP r13\n" "=LR r14\n" "=PC r15\n" "=A0 r0\n" "=A1 r1\n" "=A2 r2\n" "=A3 r3\n" "=ZF zf\n" "=SF nf\n" "=OF vf\n" "=CF cf\n" "=SN or0\n" "gpr lr .32 56 0\n" "gpr pc .32 60 0\n" "gpr cpsr .32 64 0 ____tfiae_________________qvczn\n" "gpr or0 .32 68 0\n" "gpr tf .1 64.5 0 thumb\n" "gpr ef .1 64.9 0 endian\n" "gpr jf .1 64.24 0 java\n" "gpr qf .1 64.27 0 sticky_overflow\n" "gpr vf .1 64.28 0 overflow\n" "gpr cf .1 64.29 0 carry\n" "gpr zf .1 64.30 0 zero\n" "gpr nf .1 64.31 0 negative\n" "gpr itc .4 64.10 0 if_then_count\n" "gpr gef .4 64.16 0 great_or_equal\n" "gpr r0 .32 0 0\n" "gpr r1 .32 4 0\n" "gpr r2 .32 8 0\n" "gpr r3 .32 12 0\n" "gpr r4 .32 16 0\n" "gpr r5 .32 20 0\n" "gpr r6 .32 24 0\n" "gpr r7 .32 28 0\n" "gpr r8 .32 32 0\n" "gpr r9 .32 36 0\n" "gpr r10 .32 40 0\n" "gpr r11 .32 44 0\n" "gpr r12 .32 48 0\n" "gpr r13 .32 52 0\n" "gpr r14 .32 56 0\n" "gpr r15 .32 60 0\n" "gpr r16 .32 64 0\n" "gpr r17 .32 68 0\n")
#define RZ_TYPE_COND_SINGLE(x)
Definition: rz_analysis.h:854

References cond, condstring(), free(), malloc(), NULL, out, rz_analysis_value_to_string(), RZ_TYPE_COND_SINGLE, snprintf, and strdup().

Referenced by rz_analysis_op_to_string().