Fix #2648 - save restore arg/var name and type

This commit is contained in:
pancake 2015-05-31 23:46:32 +02:00
parent 676453db6e
commit c27327cac5
5 changed files with 55 additions and 38 deletions

View File

@ -292,21 +292,41 @@ static int var_comparator (const RAnalVar *a, const RAnalVar *b){
return R_FALSE;
}
R_API void r_anal_var_list_show(RAnal *anal, RAnalFunction *fcn, int kind) {
R_API void r_anal_var_list_show(RAnal *anal, RAnalFunction *fcn, int kind, int mode) {
RList *list = r_anal_var_list(anal, fcn, kind);
r_list_sort (list, (RListComparator)var_comparator);
RAnalVar *var;
RListIter *iter;
if (mode=='j')
anal->printf ("[");
r_list_foreach (list, iter, var) {
if (var->kind == kind)
anal->printf ("%s %s %s @ %s%s0x%x\n",
kind=='v'?"var":"arg",
var->type,
var->name,
anal->reg->name[R_REG_NAME_BP],
(kind=='v')?"-":"+",
var->delta
);
if (var->kind == kind) {
switch (mode) {
case '*':
// we cant express all type info here :(
anal->printf ("af%c %d %s %s @ 0x%"PFMT64x"\n",
kind, var->delta,
var->type, var->name, fcn->addr);
break;
case 'j':
anal->printf ("{\"name\":\"%s\","
"\"kind\":\"%s\",\"type\":\"%s\",\"ref\":\"%s%s%d\"}",
var->name, var->kind=='v'?"var":"arg", var->type,
anal->reg->name[R_REG_NAME_BP],
(var->kind=='v')?"-":"+", var->delta);
if (iter->n) r_cons_printf (",");
break;
default:
anal->printf ("%s %s %s @ %s%s0x%x\n",
kind=='v'?"var":"arg",
var->type, var->name,
anal->reg->name[R_REG_NAME_BP],
(kind=='v')?"-":"+",
var->delta);
}
}
}
if (mode=='j')
anal->printf ("]\n");
r_list_free (list);
}

View File

@ -1267,6 +1267,9 @@ R_API int r_core_anal_fcn_list(RCore *core, const char *input, int rad) {
r_cons_printf ("afC %s @ 0x%08"PFMT64x"\n",
r_anal_cc_type2str (fcn->call), fcn->addr);
fcn_list_bbs (fcn);
/* show variables and arguments */
r_core_cmdf (core, "afa* @ 0x%"PFMT64x"\n", fcn->addr);
r_core_cmdf (core, "afv* @ 0x%"PFMT64x"\n", fcn->addr);
} else {
r_cons_printf ("#\n offset: 0x%08"PFMT64x"\n name: %s\n size: %"PFMT64d,
fcn->addr, fcn->name, (ut64)fcn->size);

View File

@ -24,6 +24,7 @@ static void var_help(RCore *core, char ch) {
const char* help_msg[] = {
"Usage:", "af[aAv]", " [idx] [type] [name]",
"afa", "", "list function arguments",
"afa*", "", "list function arguments in commands",
"afa", " [idx] [name] ([type])", "define argument N with name and type",
"afan", " [old_name] [new_name]", "rename function argument",
"afaj", "", "return list of function arguments in JSON format",
@ -47,7 +48,6 @@ static void var_help(RCore *core, char ch) {
static int var_cmd(RCore *core, const char *str) {
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, -1);
RList *list;
char *p, *ostr;
int delta, type = *str;
@ -56,8 +56,8 @@ static int var_cmd(RCore *core, const char *str) {
switch (type) {
case 'V': // show vars in human readable format
r_anal_var_list_show (core->anal, fcn, 'v');
r_anal_var_list_show (core->anal, fcn, 'a');
r_anal_var_list_show (core->anal, fcn, 'v', 0);
r_anal_var_list_show (core->anal, fcn, 'a', 0);
break;
case '?':
var_help (core, 0);
@ -69,13 +69,15 @@ static int var_cmd(RCore *core, const char *str) {
/* Variable access CFvs = set fun var */
switch (str[1]) {
case '\0':
r_anal_var_list_show (core->anal, fcn, type);
case '*':
case 'j':
r_anal_var_list_show (core->anal, fcn, type, str[1]);
goto end;
case '?':
var_help (core, *str);
goto end;
case '.':
r_anal_var_list_show (core->anal, fcn, core->offset);
r_anal_var_list_show (core->anal, fcn, core->offset, 0);
goto end;
case '-':
if (fcn) {
@ -102,21 +104,6 @@ static int var_cmd(RCore *core, const char *str) {
old_name, new_name);
free (old_name);
goto end;
case 'j':
list = r_anal_var_list (core->anal, fcn, type);
RAnalVar *var;
RListIter *iter;
r_cons_printf ("[");
r_list_foreach (list, iter, var) {
r_cons_printf ("{\"name\":\"%s\","
"\"kind\":\"%s\",\"type\":\"%s\",\"ref\":\"%s%s%d\"}",
var->name, var->kind=='v'?"var":"arg", var->type,
core->anal->reg->name[R_REG_NAME_BP], (var->kind=='v')?"-":"+", var->delta);
if (iter->n) r_cons_printf (",");
}
r_cons_printf ("]\n");
r_list_free (list);
goto end;
case 's':
case 'g':
if (str[2]!='\0') {
@ -128,7 +115,6 @@ static int var_cmd(RCore *core, const char *str) {
int scope = (str[1]=='g')?0: 1;
r_anal_var_access (core->anal, fcn->addr, (char)type,
scope, atoi (str+2), rw, core->offset);
//return r_anal_var_access_add (core->anal, var, atoi (str+2), (str[1]=='g')?0:1);
r_anal_var_free (var);
goto end;
}
@ -640,11 +626,19 @@ static int cmd_anal_fcn(RCore *core, const char *input) {
break;
case 'l': // "afl"
switch (input[2]) {
case '?': eprintf ("Usage: afl[j*] <addr>\n"); break;
case 'j': r_core_anal_fcn_list (core, NULL, 'j'); break; // "aflj"
case '*': r_core_anal_fcn_list (core, NULL, '*'); break; // "afl*"
case 'a': r_core_anal_fcn_list (core, NULL, 'a'); break; // "afla"
default: r_core_anal_fcn_list (core, NULL, 'q'); break; // "afl"
case '?':
eprintf ("Usage: afl[ajq*] <addr>\n");
eprintf ("List all functions in quiet, commands or json format\n");
break;
case 'a':
case '*':
case 'j':
case 'q':
r_core_anal_fcn_list (core, NULL, input[2]);
break;
default:
r_core_anal_fcn_list (core, NULL, 'q');
break;
}
break;
case 's': { // "afs"

View File

@ -103,7 +103,7 @@ static void normal_Node_print(RConsCanvas *can, Node *n, int cur) {
char *text;
int delta_x = 0;
int delta_y = 0;
int x, y, onscreen;
int x, y;
n->w = r_str_bounds (n->text, &n->h);
n->w += BORDER_WIDTH;

View File

@ -1304,7 +1304,7 @@ R_API char* r_anal_reflines_str(void *core, ut64 addr, int opts);
R_API RAnalRefline *r_anal_reflines_fcn_get( struct r_anal_t *anal, RAnalFunction *fcn,
int nlines, int linesout, int linescall);
/* TODO move to r_core */
R_API void r_anal_var_list_show(RAnal *anal, RAnalFunction *fcn, int kind);
R_API void r_anal_var_list_show(RAnal *anal, RAnalFunction *fcn, int kind, int mode);
R_API RList *r_anal_var_list(RAnal *anal, RAnalFunction *fcn, int kind);
// calling conventions API