From 0fdb4d7ab4940b0737bd4004fffcf6e272cdb419 Mon Sep 17 00:00:00 2001 From: pancake Date: Wed, 9 Oct 2024 17:50:46 +0200 Subject: [PATCH 1/5] Do not iterate over function bbs, when we can iterate over bb's functions ##analysis --- libr/anal/fcn.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libr/anal/fcn.c b/libr/anal/fcn.c index db5beeb58bf36..179be6e7ff43b 100644 --- a/libr/anal/fcn.c +++ b/libr/anal/fcn.c @@ -2243,6 +2243,9 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 if (addr == UT64_MAX) { return NULL; } +#if 1 + return r_anal_get_block_at (anal, addr); +#else RListIter *iter; RAnalBlock *bb; const bool aligned = r_anal_is_aligned (anal, addr); @@ -2255,6 +2258,7 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 // return bb; } } +#endif return NULL; } From 18c7aa4a0d25620132c32e48c21efd9dbc9f6428 Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 10 Oct 2024 12:11:16 +0200 Subject: [PATCH 2/5] try this --- libr/anal/fcn.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libr/anal/fcn.c b/libr/anal/fcn.c index 179be6e7ff43b..c0ad9babade07 100644 --- a/libr/anal/fcn.c +++ b/libr/anal/fcn.c @@ -2243,11 +2243,11 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 if (addr == UT64_MAX) { return NULL; } -#if 1 - return r_anal_get_block_at (anal, addr); -#else + RAnalBlock *bb = r_anal_get_block_at (anal, addr); + if (bb) { + return bb; + } RListIter *iter; - RAnalBlock *bb; const bool aligned = r_anal_is_aligned (anal, addr); r_list_foreach (fcn->bbs, iter, bb) { if (r_anal_block_contains (bb, addr)) { @@ -2258,7 +2258,6 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 // return bb; } } -#endif return NULL; } From 3e321be35d2f6f7cd11ddeed64f2a52a05f6a025 Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 10 Oct 2024 14:43:58 +0200 Subject: [PATCH 3/5] try3 --- libr/anal/fcn.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/libr/anal/fcn.c b/libr/anal/fcn.c index c0ad9babade07..7a6c7251afc10 100644 --- a/libr/anal/fcn.c +++ b/libr/anal/fcn.c @@ -2243,11 +2243,23 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 if (addr == UT64_MAX) { return NULL; } - RAnalBlock *bb = r_anal_get_block_at (anal, addr); + RAnalBlock *bb; + RListIter *iter; +#if 0 + // returns nothinig + bb = r_anal_get_block_at (anal, addr); if (bb) { return bb; } - RListIter *iter; +#endif +#if 1 + // works fine + RList *bbs = r_anal_get_blocks_in (anal, addr); + r_list_foreach (bbs, iter, bb) { + return bb; + } +#endif + // fallback const bool aligned = r_anal_is_aligned (anal, addr); r_list_foreach (fcn->bbs, iter, bb) { if (r_anal_block_contains (bb, addr)) { From a4505a0a5bba0098fba3263e14dff2921274846c Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 10 Oct 2024 15:06:27 +0200 Subject: [PATCH 4/5] bl --- libr/anal/fcn.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libr/anal/fcn.c b/libr/anal/fcn.c index 7a6c7251afc10..7a83ec9e7a51e 100644 --- a/libr/anal/fcn.c +++ b/libr/anal/fcn.c @@ -2256,7 +2256,13 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 // works fine RList *bbs = r_anal_get_blocks_in (anal, addr); r_list_foreach (bbs, iter, bb) { - return bb; + RListIter *iter2; + RAnalFunction *f; + r_list_foreach (bb->fcns, iter2, f) { + if (f == fcn) { + return bb; + } + } } #endif // fallback From 2f1298bf5214253a3b76789b448d034fae858cce Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 10 Oct 2024 15:13:48 +0200 Subject: [PATCH 5/5] nuse --- libr/anal/fcn.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libr/anal/fcn.c b/libr/anal/fcn.c index 7a83ec9e7a51e..2f9d29b4a4acc 100644 --- a/libr/anal/fcn.c +++ b/libr/anal/fcn.c @@ -2243,6 +2243,7 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 if (addr == UT64_MAX) { return NULL; } + const bool aligned = r_anal_is_aligned (anal, addr); RAnalBlock *bb; RListIter *iter; #if 0 @@ -2260,13 +2261,15 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 RAnalFunction *f; r_list_foreach (bb->fcns, iter2, f) { if (f == fcn) { - return bb; + if ((!anal->opt.jmpmid || !aligned || r_anal_block_op_starts_at (bb, addr))) { + return bb; + } } } } #endif - // fallback - const bool aligned = r_anal_is_aligned (anal, addr); +#if 0 + // original implementation -- fallback r_list_foreach (fcn->bbs, iter, bb) { if (r_anal_block_contains (bb, addr)) { if ((!anal->opt.jmpmid || !aligned || r_anal_block_op_starts_at (bb, addr))) { @@ -2276,6 +2279,7 @@ R_API RAnalBlock *r_anal_function_bbget_in(RAnal *anal, RAnalFunction *fcn, ut64 // return bb; } } +#endif return NULL; }