mirror of
https://github.com/radareorg/radare2.git
synced 2025-03-05 12:57:34 +00:00
Fix for function name decorators (oridinal, sym.blablabla) (#5488)
implemented function guess matched name which finds longest function name in sdb_types that is substring of the current function name
This commit is contained in:
parent
4f413e7720
commit
52da64becc
@ -247,7 +247,7 @@ R_API char *r_anal_type_format(RAnal *anal, const char *t) {
|
||||
}
|
||||
// Function prototypes api
|
||||
R_API int r_anal_type_func_exist(RAnal *anal, const char *func_name) {
|
||||
char *fcn = sdb_const_get (anal->sdb_types, func_name, 0);
|
||||
const char *fcn = sdb_const_get (anal->sdb_types, func_name, 0);
|
||||
return fcn && !strcmp (fcn, "func");
|
||||
}
|
||||
|
||||
@ -277,5 +277,24 @@ R_API char *r_anal_type_func_args_name(RAnal *anal, const char *func_name, int i
|
||||
char *query = sdb_fmt (-1, "func.%s.arg.%d", func_name, i);
|
||||
const char *get = sdb_const_get (anal->sdb_types, query, 0);
|
||||
char *ret = strchr (get, ',');
|
||||
return ret ==0 ? ret : ret + 1;
|
||||
return ret == 0 ? ret : ret + 1;
|
||||
}
|
||||
static int capture_sub_string (void *p, const char *k, const char *v) {
|
||||
char **ret = (char **)p;
|
||||
if (strcmp (v, "func")) {
|
||||
return 1;
|
||||
}
|
||||
if (strstr (ret[1], k) && (!ret[0] || strlen(k) > strlen (ret[0]))) {
|
||||
free (ret[0]);
|
||||
ret[0] = strdup (k);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
R_API char *r_anal_type_func_guess(RAnal *anal, char *func_name) {
|
||||
char *ret[] = {
|
||||
NULL,
|
||||
func_name
|
||||
};
|
||||
sdb_foreach (anal->sdb_types, capture_sub_string, ret);
|
||||
return ret[0];
|
||||
}
|
||||
|
@ -5,14 +5,14 @@
|
||||
static void type_cmd_help (RCore *core) {
|
||||
const char *help_msg[] = {
|
||||
"Usage:", "aftm", "",
|
||||
"aftm", "", "type matching ana",
|
||||
"aftm", "", "type matching analysis",
|
||||
NULL
|
||||
};
|
||||
r_core_cmd_help (core, help_msg);
|
||||
}
|
||||
static void type_cmd(RCore *core, const char *input) {
|
||||
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, -1);
|
||||
if (!fcn) {
|
||||
if (!fcn && *input != '?') {
|
||||
eprintf ("cant find function here\n");
|
||||
}
|
||||
switch (*input) {
|
||||
|
@ -15,11 +15,14 @@ static bool r_anal_emul_init (RCore *core) {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
static void type_match (RCore *core, ut64 addr, const char *fcn_name) {
|
||||
static void type_match (RCore *core, ut64 addr, char *name) {
|
||||
Sdb *trace = core->anal->esil->db_trace;
|
||||
RAnal *anal = core->anal;
|
||||
RAnalVar *v;
|
||||
if (!r_anal_type_func_exist (anal, fcn_name)) {
|
||||
char *fcn_name;
|
||||
if (r_anal_type_func_exist (anal, name)) {
|
||||
fcn_name = strdup (name);
|
||||
} else if (!(fcn_name = r_anal_type_func_guess (anal, name))) {
|
||||
eprintf ("can't find function prototype for %s\n",fcn_name);
|
||||
return;
|
||||
}
|
||||
@ -134,6 +137,7 @@ static void type_match (RCore *core, ut64 addr, const char *fcn_name) {
|
||||
}
|
||||
free (type);
|
||||
}
|
||||
free (fcn_name);
|
||||
}
|
||||
|
||||
static int stack_clean (RCore *core, ut64 addr, RAnalFunction *fcn) {
|
||||
|
@ -1124,7 +1124,8 @@ R_API int r_anal_type_func_exist(RAnal *anal, const char *func_name);
|
||||
R_API const char *r_anal_type_func_cc(RAnal *anal, const char *func_name);
|
||||
R_API int r_anal_type_func_args_count(RAnal *anal, const char *func_name);
|
||||
R_API char *r_anal_type_func_args_type(RAnal *anal, const char *func_name, int i);
|
||||
R_API char *r_anal_type_func_args_name(RAnal *anal, const char *func_name, int i);
|
||||
R_API char *r_anal_type_func_args_name(RAnal *anal, const char *func_name, int i);
|
||||
R_API char *r_anal_type_func_guess(RAnal *anal, char *func_name);
|
||||
/* anal.c */
|
||||
R_API RAnal *r_anal_new(void);
|
||||
R_API int r_anal_purge (RAnal *anal);
|
||||
|
Loading…
x
Reference in New Issue
Block a user