Rizin
unix-like reverse engineering framework and cli tools
cond.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2010-2016 pancake <pancake@nopcode.org>
2 // SPDX-License-Identifier: LGPL-3.0-only
3 
4 #include <rz_analysis.h>
5 
7  return RZ_NEW0(RzAnalysisCond);
8 }
9 
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 }
18 
20  if (!c) {
21  return;
22  }
24  free(c);
25 }
26 
27 // XXX?
30  if (!c) {
31  return NULL;
32  }
33  memcpy(c, cond, sizeof(RzAnalysisCond));
34  return c;
35 }
36 
37 static inline const char *condstring(RzAnalysisCond *cond) {
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 }
49 
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 }
61 
62 // XXX conflict naming with tostring()
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 }
91 
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 }
107 
110  // TODO: find '<','=','>','!'...
111  return cond;
112 }
RZ_API char * rz_analysis_value_to_string(RzAnalysisValue *value)
Definition: value.c:83
RZ_API ut64 rz_analysis_value_to_ut64(RzAnalysis *analysis, RzAnalysisValue *val)
Definition: value.c:41
RZ_API void rz_analysis_value_free(RzAnalysisValue *value)
Definition: value.c:29
const lzma_allocator const uint8_t size_t uint8_t * out
Definition: block.h:528
RZ_API RzAnalysisCond * rz_analysis_cond_clone(RzAnalysisCond *cond)
Definition: cond.c:28
RZ_API RzAnalysisCond * rz_analysis_cond_new_from_string(const char *str)
Definition: cond.c:108
static const char * condstring(RzAnalysisCond *cond)
Definition: cond.c:37
RZ_API RzAnalysisCond * rz_analysis_cond_new_from_op(RzAnalysisOp *op)
Definition: cond.c:92
RZ_API int rz_analysis_cond_eval(RzAnalysis *analysis, RzAnalysisCond *cond)
Definition: cond.c:50
RZ_API RzAnalysisCond * rz_analysis_cond_new(void)
Definition: cond.c:6
RZ_API void rz_analysis_cond_fini(RzAnalysisCond *c)
Definition: cond.c:10
RZ_API void rz_analysis_cond_free(RzAnalysisCond *c)
Definition: cond.c:19
RZ_API char * rz_analysis_cond_to_string(RzAnalysisCond *cond)
Definition: cond.c:63
#define RZ_API
#define NULL
Definition: cris-opc.c:27
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
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
snprintf
Definition: kernel.h:364
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
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
#define RZ_NEW0(x)
Definition: rz_types.h:284
#define RZ_NEW(x)
Definition: rz_types.h:285
#define st64
Definition: rz_types_base.h:10
#define c(i)
Definition: sha256.c:43
#define cond(bop, top, mask, flags)
Definition: dis.c:32