* Implement r_anal_cond_eval() and r_anal_value_to_ut64() functions

- Code seems to work and basicblock conditionals can be evaluated
  - Show 'match' result in 'abl' command
  - Wrong namespace
This commit is contained in:
pancake 2010-06-18 00:53:47 +02:00
parent 4812bb5877
commit 123faacd3c
4 changed files with 63 additions and 14 deletions

View File

@ -23,10 +23,40 @@ static inline const char *condstring(RAnalCond *cond) {
condstr_single [cond->type%sizeof (condstr_single)];
}
R_API int r_anal_cond_eval(RAnalCond *cond) {
ut64 arg0 = 0;
ut64 arg1 = 0;
// TODO: collect register values and return true if matching
R_API int r_anal_cond_eval(RAnal *anal, RAnalCond *cond) {
ut64 arg0 = r_anal_value_to_ut64 (anal, cond->arg[0]);
if (cond->arg[1]) {
ut64 arg1 = r_anal_value_to_ut64 (anal, cond->arg[1]);
switch (cond->type) {
case R_ANAL_COND_EQ:
return arg0 == arg1;
case R_ANAL_COND_NE:
return arg0 != arg1;
case R_ANAL_COND_GE:
return arg0 >= arg1;
case R_ANAL_COND_GT:
return arg0 > arg1;
case R_ANAL_COND_LE:
return arg0 <= arg1;
case R_ANAL_COND_LT:
return arg0 < arg1;
}
} else {
switch (cond->type) {
case R_ANAL_COND_EQ:
return !arg0;
case R_ANAL_COND_NE:
return arg0;
case R_ANAL_COND_GT:
return arg0>0;
case R_ANAL_COND_GE:
return arg0>=0;
case R_ANAL_COND_LT:
return arg0<0;
case R_ANAL_COND_LE:
return arg0<=0;
}
}
return R_FALSE;
}

View File

@ -19,11 +19,25 @@ R_API void r_anal_value_free(RAnalValue *value) {
free (value);
}
R_API st64 r_anal_value_eval(RAnalValue *value) {
/* OMFG TODO.. this is done by r_num_shit */
// r_num_math (anal->num, ...);
#warning TODO r_anal_value_eval
return 0LL;
R_API ut64 r_anal_value_to_ut64(RAnal *anal, RAnalValue *val) {
ut64 num;
if (val==NULL)
return 0LL;
num = val->base + (val->delta*(val->mul?val->mul:1));
if (val->reg)
num += r_reg_get_value (anal->reg, val->reg);
if (val->regdelta)
num += r_reg_get_value (anal->reg, val->regdelta);
switch (val->memref) {
case 1:
case 2:
case 4:
case 8:
//anal->bio ...
eprintf ("TODO: memref for to_ut64 not supported\n");
break;
}
return num;
}
R_API char *r_anal_value_to_string (RAnalValue *value) {

View File

@ -1,4 +1,6 @@
/* radare - LGPL - Copyright 2009-2010 nibble<.ds@gmail.com> */
/* radare - LGPL - Copyright 2009-2010 */
/* pancake<nopcode.org> */
/* nibble<.ds@gmail.com> */
#include <r_types.h>
#include <r_list.h>
@ -216,8 +218,11 @@ R_API int r_core_anal_bb_list(RCore *core, int rad) {
r_cons_printf ("unmatch");
else r_cons_printf ("new");
r_cons_printf (" cond=\"%s\"\n", bbi->cond?
r_anal_cond_to_string (bbi->cond):"none");
if (bbi->cond)
r_cons_printf (" cond=\"%s\" match=%d\n",
r_anal_cond_to_string (bbi->cond),
r_anal_cond_eval (core->anal, bbi->cond));
else r_cons_newline();
}
}
r_cons_flush ();

View File

@ -328,14 +328,14 @@ R_API RAnalValue *r_anal_value_new();
R_API RAnalValue *r_anal_value_new_from_string(const char *str);
R_API st64 r_anal_value_eval(RAnalValue *value);
R_API char *r_anal_value_to_string (RAnalValue *value);
R_API ut64 r_anal_value_to_ut64(RAnal *anal, RAnalValue *val);
R_API void r_anal_value_free(RAnalValue *value);
R_API RAnalCond *r_anal_cond_new();
R_API RAnalCond *r_anal_cond_new_from_aop(RAnalOp *op);
#define r_anal_cond_free(x) free(x);
R_API int r_anal_cond_eval(RAnalCond *cond);
R_API char *r_anal_cond_to_string(RAnalCond *cond);
R_API char *r_anal_value_to_string (RAnalValue *value);
R_API int r_anal_cond_eval (RAnal *anal, RAnalCond *cond);
R_API RAnalCond *r_anal_cond_new_from_string(const char *str);
/* reflines.c */