Remove dead code of /b.

/b (backward search) was apparently not used anywhere anymore.
This commit is contained in:
Rot127 2025-12-30 17:39:32 +01:00 committed by NOT XVilka
parent 154421ddbb
commit 56b4f77916
4 changed files with 48 additions and 159 deletions

View file

@ -1768,7 +1768,6 @@ RZ_API int rz_core_analysis_search(RzCore *core, ut64 from, ut64 to, ut64 ref, i
int i, count = 0;
RzAnalysisOp op = { 0 };
ut64 at;
char bckwrds, do_bckwrd_srch;
int arch = -1;
if (core->rasm->bits == 64) {
// speedup search
@ -1776,10 +1775,6 @@ RZ_API int rz_core_analysis_search(RzCore *core, ut64 from, ut64 to, ut64 ref, i
arch = RZ_ARCH_ARM64;
}
}
// TODO: get current section range here
// ???
// XXX must read bytes correctly
do_bckwrd_srch = bckwrds = core->search->bckwrds;
if (core->file) {
rz_io_use_fd(core->io, core->file->fd);
}
@ -1790,17 +1785,8 @@ RZ_API int rz_core_analysis_search(RzCore *core, ut64 from, ut64 to, ut64 ref, i
}
rz_cons_break_push(NULL, NULL);
if (core->blocksize > OPSZ) {
if (bckwrds) {
if (from + core->blocksize > to) {
at = from;
do_bckwrd_srch = false;
} else {
at = to - core->blocksize;
}
} else {
at = from;
}
while ((!bckwrds && at < to) || bckwrds) {
at = from;
while (at < to) {
eprintf("\r[0x%08" PFMT64x "-0x%08" PFMT64x "] ", at, to);
if (rz_cons_is_breaked()) {
break;
@ -1810,10 +1796,7 @@ RZ_API int rz_core_analysis_search(RzCore *core, ut64 from, ut64 to, ut64 ref, i
RZ_LOG_ERROR("core: failed to read at 0x%08" PFMT64x "\n", at);
break;
}
for (i = bckwrds ? (core->blocksize - OPSZ - 1) : 0;
(!bckwrds && i < core->blocksize - OPSZ) ||
(bckwrds && i > 0);
bckwrds ? i-- : i++) {
for (i = 0; (i < core->blocksize - OPSZ); i++) {
// TODO: honor analysis.align
if (rz_cons_is_breaked()) {
break;
@ -1896,19 +1879,7 @@ RZ_API int rz_core_analysis_search(RzCore *core, ut64 from, ut64 to, ut64 ref, i
i += op.size - 1;
rz_analysis_op_fini(&op);
}
if (bckwrds) {
if (!do_bckwrd_srch) {
break;
}
if (at > from + core->blocksize - OPSZ) {
at -= core->blocksize;
} else {
do_bckwrd_srch = false;
at = from;
}
} else {
at += core->blocksize - OPSZ;
}
at += core->blocksize - OPSZ;
}
} else {
RZ_LOG_ERROR("core: block size too small\n");

View file

@ -941,9 +941,6 @@ static void do_string_search(RzCore *core, RzInterval search_itv, struct search_
if (!param->regex_search && !(buf = malloc(core->blocksize))) {
return;
}
if (search->bckwrds) {
rz_search_string_prepare_backward(search);
}
rz_cons_break_push(NULL, NULL);
// TODO search cross boundary
rz_list_foreach (param->boundaries, iter, map) {
@ -965,53 +962,42 @@ static void do_string_search(RzCore *core, RzInterval search_itv, struct search_
}
eprintf(" in [0x%" PFMT64x ",0x%" PFMT64x ")\n", itv.addr, rz_itv_end(itv));
}
if (!core->search->bckwrds) {
RzListIter *it;
RzSearchKeyword *kw;
rz_list_foreach (core->search->kws, it, kw) {
kw->last = 0;
}
RzListIter *it;
RzSearchKeyword *kw;
rz_list_foreach (core->search->kws, it, kw) {
kw->last = 0;
}
const ut64 from = itv.addr, to = rz_itv_end(itv),
from1 = search->bckwrds ? to : from,
to1 = search->bckwrds ? from : to;
from1 = from,
to1 = to;
ut64 len;
size_t c = 0;
for (at = from1; at != to1; at = search->bckwrds ? at - len : at + len, c++) {
for (at = from1; at != to1; at = at + len) {
print_search_progress(at, to1, search->nhits, param, c);
if (rz_cons_is_breaked()) {
eprintf("\n\n");
break;
}
if (search->bckwrds) {
len = RZ_MIN(core->blocksize, at - from);
// TODO prefix_read_at
if (!rz_io_is_valid_offset(core->io, at - len, 0)) {
break;
if (param->regex_search) {
// Since regex match length can be infinite, for 100% correctness
// it is not possible to chunk the search. This could be a problem
// for large binaries.
free(buf);
len = to - at;
if (!(buf = malloc(len))) {
RZ_LOG_ERROR("Cannot allocate search buffer"
" of size 0x%" PFMT64x "\n",
len);
return;
}
(void)rz_io_read_at(core->io, at - len, buf, len);
} else {
if (param->regex_search) {
// Since regex match length can be infinite, for 100% correctness
// it is not possible to chunk the search. This could be a problem
// for large binaries.
free(buf);
len = to - at;
if (!(buf = malloc(len))) {
RZ_LOG_ERROR("Cannot allocate search buffer"
" of size 0x%" PFMT64x "\n",
len);
return;
}
} else {
len = RZ_MIN(core->blocksize, to - at);
}
if (!rz_io_is_valid_offset(core->io, at, 0)) {
break;
}
(void)rz_io_read_at(core->io, at, buf, len);
len = RZ_MIN(core->blocksize, to - at);
}
if (!rz_io_is_valid_offset(core->io, at, 0)) {
break;
}
(void)rz_io_read_at(core->io, at, buf, len);
rz_search_update(core->search, at, buf, len);
if (param->aes_search) {
// Adjust length to search between blocks.
@ -1449,7 +1435,6 @@ static int cmd_search_legacy_handler(void *data, const char *input) {
core->search->maxhits = rz_config_get_i(core->config, "search.maxhits");
param.hit_prefix = rz_config_get(core->config, "search.prefix");
core->search->overlap = rz_config_get_i(core->config, "search.overlap");
core->search->bckwrds = false;
/* Quick & dirty check for json output */
if (input[0] && (input[1] == 'j') && (input[0] != ' ')) {
@ -1464,22 +1449,6 @@ reread:
input++;
param.inverse = true;
goto reread;
case 'b': // "/b" backward search
if (*(++input) == '?') {
RZ_LOG_ERROR("core: Usage: /b<command> [value] backward search, see '/?'\n");
goto beach;
}
search->bckwrds = true;
if (core->offset) {
RzInterval itv = { 0, core->offset };
if (!rz_itv_overlap(search_itv, itv)) {
ret = false;
goto beach;
} else {
search_itv = rz_itv_intersect(search_itv, itv);
}
}
goto reread;
case 'r': // "/r"
{
ut64 n = (input[1] == ' ' || (input[1] && input[2] == ' '))

View file

@ -70,7 +70,6 @@ typedef struct rz_search_t {
int (*update)(struct rz_search_t *s, ut64 from, const ut8 *buf, int len);
RzList /*<RzSearchKeyword *>*/ *kws; // TODO: Use rz_search_kw_new ()
RzIOBind iob;
char bckwrds;
int preludecnt; ///< Counts found preludes.
} RzSearch;
@ -104,7 +103,6 @@ RZ_API RzSearchKeyword *rz_search_keyword_new_regexp(const char *str, const char
RZ_API int rz_search_kw_add(RzSearch *s, RzSearchKeyword *kw);
RZ_API void rz_search_reset(RzSearch *s, int mode);
RZ_API void rz_search_kw_reset(RzSearch *s);
RZ_API void rz_search_string_prepare_backward(RzSearch *s);
// TODO: is this an internal API?
RZ_API int rz_search_mybinparse_update(RzSearch *s, ut64 from, const ut8 *buf, int len);

View file

@ -154,13 +154,13 @@ RZ_API int rz_search_legacy_hit_new(RzSearch *s, RzSearchKeyword *kw, ut64 addr)
if (!s->contiguous) {
if (kw->last && addr == kw->last) {
kw->count--;
kw->last = s->bckwrds ? addr : addr + kw->keyword_length;
kw->last = addr + kw->keyword_length;
eprintf("0x%08" PFMT64x " Sequential hit ignored.\n", addr);
return 1;
}
}
// kw->last is used by string search, the right endpoint of last match (forward search), to honor search.overlap
kw->last = s->bckwrds ? addr : addr + kw->keyword_length;
kw->last = addr + kw->keyword_length;
if (s->callback) {
int ret = s->callback(kw, s->user, addr);
@ -207,32 +207,17 @@ RZ_API int rz_search_deltakey_update(RzSearch *s, ut64 from, const ut8 *buf, int
}
s->data = left;
left->len = 0;
if (s->bckwrds) {
rz_list_foreach (s->kws, iter, kw) {
ut8 *i = kw->bin_keyword, *j = kw->bin_keyword + kw->keyword_length;
for (; i < j; i++) {
*i = -*i;
}
}
}
}
if (s->bckwrds) {
// XXX Change function signature from const ut8 * to ut8 *
ut8 *i = (ut8 *)buf, *j = i + len;
while (i < j) {
ut8 t = *i;
*i++ = *--j;
*j = t;
}
}
ut64 len1 = left->len + RZ_MIN(longest - 1, len);
memcpy(left->data + left->len, buf, len1 - left->len);
rz_list_foreach (s->kws, iter, kw) {
ut8 *a = kw->bin_keyword;
i = s->overlap || !kw->count ? 0 : s->bckwrds ? kw->last - from < left->len ? from + left->len - kw->last : 0
: from - kw->last < left->len ? kw->last + left->len - from
: 0;
i = s->overlap ||
!kw->count
? 0
: from - kw->last < left->len ? kw->last + left->len - from
: 0;
for (; i + kw->keyword_length < len1 && i < left->len; i++) {
if ((ut8)(left->data[i + 1] - left->data[i]) == a[0]) {
j = 1;
@ -240,8 +225,8 @@ RZ_API int rz_search_deltakey_update(RzSearch *s, ut64 from, const ut8 *buf, int
j++;
}
if (j == kw->keyword_length) {
int t = rz_search_legacy_hit_new(s, kw, s->bckwrds ? from - kw->keyword_length - 1 - i + left->len : from + i - left->len);
kw->last += s->bckwrds ? 0 : 1;
int t = rz_search_legacy_hit_new(s, kw, from + i - left->len);
kw->last += 1;
if (!t) {
return -1;
}
@ -254,9 +239,8 @@ RZ_API int rz_search_deltakey_update(RzSearch *s, ut64 from, const ut8 *buf, int
}
}
}
i = s->overlap || !kw->count ? 0 : s->bckwrds ? from > kw->last ? from - kw->last : 0
: from < kw->last ? kw->last - from
: 0;
i = s->overlap || !kw->count ? 0 : from < kw->last ? kw->last - from
: 0;
for (; i + kw->keyword_length < len; i++) {
if ((ut8)(buf[i + 1] - buf[i]) == a[0]) {
j = 1;
@ -264,8 +248,8 @@ RZ_API int rz_search_deltakey_update(RzSearch *s, ut64 from, const ut8 *buf, int
j++;
}
if (j == kw->keyword_length) {
int t = rz_search_legacy_hit_new(s, kw, s->bckwrds ? from - kw->keyword_length - 1 - i : from + i);
kw->last += s->bckwrds ? 0 : 1;
int t = rz_search_legacy_hit_new(s, kw, from + i);
kw->last += 1;
if (!t) {
return -1;
}
@ -290,7 +274,7 @@ RZ_API int rz_search_deltakey_update(RzSearch *s, ut64 from, const ut8 *buf, int
left->len = longest - 1;
memcpy(left->data, buf + len - longest + 1, longest - 1);
}
left->end = s->bckwrds ? from - len : from + len;
left->end = from + len;
return s->nhits - old_nhits;
}
@ -379,25 +363,15 @@ RZ_API int rz_search_mybinparse_update(RzSearch *s, ut64 from, const ut8 *buf, i
s->data = left;
left->len = 0;
}
if (s->bckwrds) {
// XXX Change function signature from const ut8 * to ut8 *
ut8 *i = (ut8 *)buf, *j = i + len;
while (i < j) {
ut8 t = *i;
*i++ = *--j;
*j = t;
}
}
ut64 len1 = left->len + RZ_MIN(longest - 1, len);
memcpy(left->data + left->len, buf, len1 - left->len);
rz_list_foreach (s->kws, iter, kw) {
i = s->overlap || !kw->count ? 0 : s->bckwrds ? kw->last - from < left->len ? from + left->len - kw->last : 0
: from - kw->last < left->len ? kw->last + left->len - from
: 0;
i = s->overlap || !kw->count ? 0 : from - kw->last < left->len ? kw->last + left->len - from
: 0;
for (; i + kw->keyword_length <= len1 && i < left->len; i++) {
if (brute_force_match(s, kw, left->data, i) != s->inverse) {
int t = rz_search_legacy_hit_new(s, kw, s->bckwrds ? from - kw->keyword_length - i + left->len : from + i - left->len);
int t = rz_search_legacy_hit_new(s, kw, from + i - left->len);
if (!t) {
return -1;
}
@ -409,12 +383,11 @@ RZ_API int rz_search_mybinparse_update(RzSearch *s, ut64 from, const ut8 *buf, i
}
}
}
i = s->overlap || !kw->count ? 0 : s->bckwrds ? from > kw->last ? from - kw->last : 0
: from < kw->last ? kw->last - from
: 0;
i = s->overlap || !kw->count ? 0 : from < kw->last ? kw->last - from
: 0;
for (; i + kw->keyword_length <= len; i++) {
if (brute_force_match(s, kw, buf, i) != s->inverse) {
int t = rz_search_legacy_hit_new(s, kw, s->bckwrds ? from - kw->keyword_length - i : from + i);
int t = rz_search_legacy_hit_new(s, kw, from + i);
if (!t) {
return -1;
}
@ -438,7 +411,7 @@ RZ_API int rz_search_mybinparse_update(RzSearch *s, ut64 from, const ut8 *buf, i
left->len = longest - 1;
memcpy(left->data, buf + len - longest + 1, longest - 1);
}
left->end = s->bckwrds ? from - len : from + len;
left->end = from + len;
return s->nhits - old_nhits;
}
@ -509,28 +482,6 @@ RZ_API int rz_search_kw_add(RzSearch *s, RzSearchKeyword *kw) {
return true;
}
// Reverse bin_keyword & bin_binmask for backward search
RZ_API void rz_search_string_prepare_backward(RzSearch *s) {
RzListIter *iter;
RzSearchKeyword *kw;
// Precondition: !kw->binmask_length || kw->keyword_length % kw->binmask_length == 0
rz_list_foreach (s->kws, iter, kw) {
ut8 *i = kw->bin_keyword, *j = kw->bin_keyword + kw->keyword_length;
while (i < j) {
ut8 t = *i;
*i++ = *--j;
*j = t;
}
i = kw->bin_binmask;
j = kw->bin_binmask + kw->binmask_length;
while (i < j) {
ut8 t = *i;
*i++ = *--j;
*j = t;
}
}
}
RZ_API void rz_search_reset(RzSearch *s, int mode) {
s->nhits = 0;
if (!rz_search_set_mode(s, mode)) {