Skip to content

Commit 2cf5398

Browse files
committed
Fix abl printing correct xrefs
1 parent a37de24 commit 2cf5398

2 files changed

Lines changed: 321 additions & 208 deletions

File tree

‎librz/core/cmd/cmd_analysis.c‎

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5489,23 +5489,20 @@ RZ_IPI RzCmdStatus rz_analysis_all_esil_functions_handler(RzCore *core, int argc
54895489
return RZ_CMD_STATUS_OK;
54905490
}
54915491

5492-
static RzList /*<ut64 *>*/ *get_xrefs(RzAnalysisBlock *block) {
5492+
static RzSetU *get_xrefs(RzAnalysisBlock *block) {
54935493
RzListIter *iter;
54945494
RzAnalysisXRef *xref;
5495-
RzList *list = NULL;
5495+
RzSetU *set = rz_set_u_new();
54965496
size_t i;
54975497
for (i = 0; i < block->ninstr; i++) {
54985498
ut64 ia = block->addr + block->op_pos[i];
54995499
RzList *xrefs = rz_analysis_xrefs_get_to(block->analysis, ia);
55005500
rz_list_foreach (xrefs, iter, xref) {
5501-
if (!list) {
5502-
list = rz_list_newf(free);
5503-
}
5504-
rz_list_push(list, ut64_new(xref->from));
5501+
rz_set_u_add(set, xref->from);
55055502
}
55065503
rz_list_free(xrefs);
55075504
}
5508-
return list;
5505+
return set;
55095506
}
55105507

55115508
static RZ_OWN RzSetU *get_calls(RzCore *core, RzAnalysisBlock *block) {
@@ -5522,19 +5519,23 @@ static RZ_OWN RzSetU *get_calls(RzCore *core, RzAnalysisBlock *block) {
55225519
if (ret < 1) {
55235520
continue;
55245521
}
5525-
if (op.type == RZ_ANALYSIS_OP_TYPE_CALL) {
5526-
rz_set_u_add(calls, op.jump);
5527-
5528-
RzList *xrefs = rz_analysis_xrefs_get_from(block->analysis, op.addr);
5529-
RzAnalysisXRef *xref;
5530-
RzListIter *iter;
5531-
rz_list_foreach (xrefs, iter, xref) {
5532-
if (xref->type != RZ_ANALYSIS_XREF_TYPE_CALL) {
5533-
continue;
5522+
if (rz_analysis_op_is_call(&op)) {
5523+
if (op.jump != UT64_MAX) {
5524+
rz_set_u_add(calls, op.jump);
5525+
} else {
5526+
// No statically know call target.
5527+
// Check if a previous analysis found any xrefs from it.
5528+
RzList *xrefs = rz_analysis_xrefs_get_from(block->analysis, op.addr);
5529+
RzAnalysisXRef *xref;
5530+
RzListIter *iter;
5531+
rz_list_foreach (xrefs, iter, xref) {
5532+
if (xref->type != RZ_ANALYSIS_XREF_TYPE_CALL) {
5533+
continue;
5534+
}
5535+
rz_set_u_add(calls, xref->to);
55345536
}
5535-
rz_set_u_add(calls, xref->to);
5537+
rz_list_free(xrefs);
55365538
}
5537-
rz_list_free(xrefs);
55385539
}
55395540
rz_analysis_op_fini(&op);
55405541
if (op.size > 0) {
@@ -5567,7 +5568,7 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
55675568
RzAnalysisBlock *block;
55685569
RBTree *bb_tree = rz_analysis_get_bb_tree(core->analysis);
55695570
rz_rbtree_foreach ((*bb_tree), iter, block, RzAnalysisBlock, _rb) {
5570-
RzList *xrefs = get_xrefs(block);
5571+
RzSetU *xrefs = get_xrefs(block);
55715572
RzSetU *calls = get_calls(core, block);
55725573
switch (state->mode) {
55735574
case RZ_OUTPUT_MODE_JSON:
@@ -5584,11 +5585,12 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
55845585
}
55855586
if (xrefs) {
55865587
pj_ka(pj, "xrefs");
5587-
RzListIter *iter2;
55885588
ut64 *addr;
5589-
rz_list_foreach (xrefs, iter2, addr) {
5589+
RzIterator *xref_iter = rz_set_u_as_iter(xrefs);
5590+
rz_iterator_foreach(xref_iter, addr) {
55905591
pj_n(pj, *addr);
55915592
}
5593+
rz_iterator_free(xref_iter);
55925594
pj_end(pj);
55935595
}
55945596
if (calls) {
@@ -5614,7 +5616,7 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
56145616
char *jump = block->jump != UT64_MAX ? rz_str_newf("0x%08" PFMT64x, block->jump) : rz_str_dup("");
56155617
char *fail = block->fail != UT64_MAX ? rz_str_newf("0x%08" PFMT64x, block->fail) : rz_str_dup("");
56165618
char *call = ut64join(calls);
5617-
char *xref = ut64join(calls);
5619+
char *xref = ut64join(xrefs);
56185620
char *fcns = fcnjoin(block->fcns);
56195621
rz_table_add_rowf(table, "xnddsssss",
56205622
block->addr,
@@ -5644,12 +5646,12 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
56445646
rz_cons_printf(" .f 0x%08" PFMT64x, block->fail);
56455647
}
56465648
if (xrefs) {
5647-
RzListIter *iter2;
5648-
rz_cons_printf(" .x");
56495649
ut64 *addr;
5650-
rz_list_foreach (xrefs, iter2, addr) {
5650+
RzIterator *xref_iter = rz_set_u_as_iter(xrefs);
5651+
rz_iterator_foreach(xref_iter, addr) {
56515652
rz_cons_printf(" 0x%08" PFMT64x, *addr);
56525653
}
5654+
rz_iterator_free(xref_iter);
56535655
}
56545656
if (calls) {
56555657
rz_cons_printf(" .c");
@@ -5674,7 +5676,7 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
56745676
status = RZ_CMD_STATUS_WRONG_ARGS;
56755677
iter.len = 0;
56765678
}
5677-
rz_list_free(xrefs);
5679+
rz_set_u_free(xrefs);
56785680
rz_set_u_free(calls);
56795681
}
56805682
rz_cmd_state_output_array_end(state);

0 commit comments

Comments
 (0)