Fix #4080 : remove assumption that functions are contiguous

* anal/p/anal_java: remove function that does nothing

* anal/fcn: workaround for java analysis
This commit is contained in:
Riccardo Schirone 2016-05-14 16:37:24 +02:00 committed by radare
parent 7ab187841f
commit c169073c74
5 changed files with 32 additions and 55 deletions

View File

@ -597,7 +597,7 @@ repeat:
#else
// hardcoded jmp size // must be checked at the end wtf?
// always fitfcnsz and retend
if (op.jump>fcn->addr && op.jump<(fcn->addr+fcn->size)) {
if (r_anal_fcn_is_in_offset (op.jump)) {
/* jump inside the same function */
FITFCNSZ();
return R_ANAL_RET_END;
@ -857,8 +857,7 @@ R_API void r_anal_trim_jmprefs(RAnalFunction *fcn) {
RListIter *iter;
RListIter *tmp;
r_list_foreach_safe (fcn->refs, iter, tmp, ref) {
if (ref->type == R_ANAL_REF_TYPE_CODE &&
ref->addr >= fcn->addr && (ref->addr - fcn->addr) < fcn->size) {
if (ref->type == R_ANAL_REF_TYPE_CODE && r_anal_fcn_is_in_offset (fcn, ref->addr)) {
r_list_delete(fcn->refs, iter);
}
}
@ -1025,11 +1024,9 @@ R_API RAnalFunction *r_anal_get_fcn_in(RAnal *anal, ut64 addr, int type) {
}
r_list_foreach (anal->fcns, iter, fcn) {
if (!type || (fcn && fcn->type & type)) {
if (addr == fcn->addr ||
(ret == NULL && ((addr > fcn->addr) &&
(addr < fcn->addr + fcn->size))))
if (fcn->addr == addr || (!ret && r_anal_fcn_is_in_offset (fcn, addr))) {
ret = fcn;
}
}
}
return ret;
@ -1040,8 +1037,9 @@ R_API RAnalFunction *r_anal_fcn_find_name(RAnal *anal, const char *name) {
RAnalFunction *fcn = NULL;
RListIter *iter;
r_list_foreach (anal->fcns, iter, fcn) {
if (!strcmp (name, fcn->name))
if (!strcmp (name, fcn->name)) {
return fcn;
}
}
return NULL;
}
@ -1294,16 +1292,35 @@ R_API RList* r_anal_fcn_get_bbs (RAnalFunction *anal) {
}
R_API int r_anal_fcn_is_in_offset (RAnalFunction *fcn, ut64 addr) {
return (addr >= fcn->addr && addr < (fcn->addr+fcn->size));
RAnalBlock *bb;
RListIter *iter;
bool has_bbs = false;
r_list_foreach (fcn->bbs, iter, bb) {
has_bbs = true;
if (addr >= bb->addr && addr < bb->addr + bb->size) {
return true;
}
}
if (!has_bbs) {
// hack to make anal_java work, because it doesn't use
// basicblocks.
// FIXME: anal_java should create basicblocks
return addr >= fcn->addr && addr < fcn->addr + fcn->size;
}
return false;
}
R_API int r_anal_fcn_count (RAnal *anal, ut64 from, ut64 to) {
int n = 0;
RAnalFunction *fcni;
RListIter *iter;
r_list_foreach (anal->fcns, iter, fcni)
if (fcni->addr >= from && fcni->addr < to)
r_list_foreach (anal->fcns, iter, fcni) {
if (fcni->addr >= from && fcni->addr < to) {
return n++;
}
}
return n;
}

View File

@ -51,7 +51,6 @@ ut64 METHOD_START = 0;
// report bad blocks. currently is should be easy to ignore these blocks,
// in output for the pdj
//static int java_print_ssa_fcn (RAnal *anal, char *addr);
//static int java_print_ssa_bb (RAnal *anal, char *addr);
static int java_reset_counter (RAnal *anal, ut64 addr);
static int java_new_method (ut64 addr);
@ -457,45 +456,7 @@ static int handle_bb_cf_linear_sweep (RAnal *anal, RAnalState *state) {
return result;
}
static int java_print_ssa_fcn (RAnal *anal, const char *addrs) {
ut64 addr = addrs ? strtoul (addrs, NULL, 16): 0;
RList *fcns = anal->fcns; //, *bb_ssa = NULL;
RAnalFunction *fcn = NULL, *found_fcn = NULL;
RListIter *iter;
//char *ssa_str = NULL;
//ut32 ssa_idx = 0;
RBinJavaObj *bin_obj = (RBinJavaObj * )get_java_bin_obj(anal);
if (!addrs || (*addrs != '0' && addr == 0)) return 0;
r_list_foreach (fcns, iter, fcn) {
if (fcn->addr == addr ||
(fcn->addr < addr && addr < (fcn->addr + fcn->size))) {
found_fcn = fcn;
break;
}
}
if (!found_fcn || !bin_obj) return 0;
//ssa_java_init ();
//bb_ssa = ssa_java_fcn_emit_ssa_to_sdb (anal, bin_obj, fcn->addr, fcn->bbs);
//r_list_foreach (bb_ssa, iter, ssa_str) {
// eprintf ("%s\n", ssa_str);
// //free (ssa_str);
//}
//r_list_free (bb_ssa);
/*r_list_foreach (found_fcn->bbs, iter, bb) {
char *ssa_str = ssa_java_emit_ssa_to_sdb (anal, bin_obj, bb);
eprintf ("%s\n", ssa_str);
free (ssa_str);
}*/
return 0;
}
static int analyze_from_code_buffer ( RAnal *anal, RAnalFunction *fcn, ut64 addr, const ut8 *code_buf, ut64 code_length ) {
char gen_name[1025];
RListIter *bb_iter;
RAnalBlock *bb;
@ -932,7 +893,6 @@ static int java_cmd_ext(RAnal *anal, const char* input) {
break;
case 's':
switch (*(input+1)) {
case 'f': return java_print_ssa_fcn (anal, input+2);
//case 'e': return java_resolve_cp_idx_b64 (anal, input+2);
default: break;
}

View File

@ -1126,7 +1126,7 @@ R_API int r_core_anal_fcn(RCore *core, ut64 at, ut64 from, int reftype, int dept
fcn = r_anal_get_fcn_in (core->anal, at, 0);
if (fcn) {
if (fcn->addr == at) return 0; // already analyzed function
if (from >= fcn->addr && (from - fcn->addr) < fcn->size) { // inner function
if (r_anal_fcn_is_in_offset (fcn, from)) { // inner function
RAnalRef *ref;
// XXX: use r_anal-xrefs api and sdb

View File

@ -1050,7 +1050,7 @@ static void handle_setup_pre(RCore *core, RDisasmState *ds, bool tail) {
}
} else if (f->addr + f->size - ds->analop.size == ds->at) {
handle_set_pre (ds, core->cons->vline[RDWN_CORNER]);
} else if (ds->at > f->addr && ds->at < f->addr+f->size-1) {
} else if (r_anal_fcn_is_in_offset (f, ds->at)) {
handle_set_pre (ds, core->cons->vline[LINE_VERT]);
}
@ -2711,7 +2711,7 @@ toro:
f = r_anal_get_fcn_in (core->anal, ds->at, R_ANAL_FCN_TYPE_NULL);
ds->fcn = f;
if (f && f->folded && ds->at >= f->addr && ds->at < f->addr+f->size) {
if (f && f->folded && r_anal_fcn_is_in_offset (f, ds->at)) {
int delta = (ds->at <= f->addr)? (ds->at - f->addr + f->size): 0;
if (of != f) {
char cmt[32];

View File

@ -1789,7 +1789,7 @@ static int r_cmd_java_handle_list_code_references (RCore *core, const char *inpu
fmt = "addr:0x%"PFMT64x" method_name:\"%s\", op:\"%s\" type:\"%s\" info:\"%s\"\n";
r_list_foreach (anal->fcns, fcn_iter, fcn) {
ut8 do_this_one = func_addr == -1 || (fcn->addr <= func_addr && func_addr <= fcn->addr + fcn->size);
ut8 do_this_one = func_addr == -1 || r_anal_fcn_is_in_offset (fcn, func_addr);
if (!do_this_one) continue;
r_list_foreach (fcn->bbs, bb_iter, bb) {
char *operation = NULL, *type = NULL;