Skip to content

Commit 49761c5

Browse files
committed
improve variable tooltip with endian-safe pointer resolution
1 parent 2fa29cc commit 49761c5

2 files changed

Lines changed: 137 additions & 8 deletions

File tree

bits

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
src/core/Cutter.cpp: int bits = core->rasm->bits;
2+
src/core/Cutter.cpp: CutterHtSP<RzAsmPlugin>(core->rasm->plugins)
3+
src/core/Cutter.cpp: CutterHtSP<RzAsmPlugin>(core->rasm->plugins).ForEach([&](const char *k, const RzAsmPlugin *ap) {
4+
src/core/Cutter.cpp: CutterHtSP<RzAsmPlugin>(core->rasm->plugins)
5+
src/widgets/DecompilerWidget.cpp: int bits = core->rasm->bits;
6+
src/widgets/DecompilerWidget.cpp: pointedAddr = rz_read_ble(ptrBuf, core->rasm->big_endian, bits);
7+
rizin/librz/include/rz_types.h: struct dummy_rz_core_t *core = (struct dummy_rz_core_t *)rasm->core;
8+
rizin/librz/include/rz_types.h: return rasm->plugin_data;
9+
rizin/librz/core/carch.c: if (core->rasm->cur && RZ_STR_ISNOTEMPTY(core->rasm->cur->name)) {
10+
rizin/librz/core/carch.c: return core->rasm->cur->name;
11+
rizin/librz/core/carch.c: if (core->rasm->bits > 0) {
12+
rizin/librz/core/carch.c: return core->rasm->bits;
13+
rizin/librz/core/carch.c: if (core->rasm->pcalign > 0) {
14+
rizin/librz/core/carch.c: return core->rasm->pcalign;
15+
rizin/librz/core/carch.c: if (RZ_STR_ISNOTEMPTY(core->rasm->cpu)) {
16+
rizin/librz/core/carch.c: return core->rasm->cpu;
17+
rizin/librz/core/carch.c: if (RZ_STR_ISNOTEMPTY(core->rasm->platforms)) {
18+
rizin/librz/core/carch.c: return core->rasm->platforms;
19+
rizin/librz/core/carch.c: if (RZ_STR_ISNOTEMPTY(core->rasm->features)) {
20+
rizin/librz/core/carch.c: return core->rasm->features;
21+
rizin/librz/core/carch.c: } else if (!core->rasm->cur) {
22+
rizin/librz/core/carch.c: ut32 bits = core->rasm->cur->bits;
23+
rizin/librz/core/carch.c: } else if (!core->rasm->cur) {
24+
rizin/librz/core/carch.c: core_update_config_options(node, core->rasm->cur->cpus);
25+
rizin/librz/core/carch.c: } else if (!core->rasm->cur) {
26+
rizin/librz/core/carch.c: core_update_config_options(node, core->rasm->cur->platforms);
27+
rizin/librz/core/carch.c: } else if (!core->rasm->cur) {
28+
rizin/librz/core/carch.c: core_update_config_options(node, core->rasm->cur->features);
29+
rizin/librz/core/carch.c: bool big_endian = core->rasm->big_endian;
30+
rizin/librz/core/carch.c: core->rasm->pcalign = align;
31+
rizin/librz/core/carch.c: free(core->rasm->platforms);
32+
rizin/librz/core/carch.c: core->rasm->platforms = rz_str_dup(platform);
33+
rizin/librz/core/carch.c: return core->rasm->bits;
34+
rizin/librz/core/carch.c: core_update_config_b(core, "cfg.bigendian", core->rasm->big_endian);
35+
rizin/librz/core/canalysis.c: if (core->rasm->bits == 64) {
36+
rizin/librz/core/canalysis.c: if (!strncmp(core->rasm->cur->name, "arm", 3)) {
37+
rizin/librz/core/canalysis.c: int word = wordsize ? wordsize : core->rasm->bits / 8;
38+
rizin/librz/core/canalysis.c: int bits2 = core->rasm->bits;
39+
rizin/librz/core/canalysis.c: core->rasm->bits = bits2;
40+
rizin/librz/core/canalysis.c: if (core->rasm->bits == 64) {
41+
rizin/librz/core/canalysis.c: int bits = core->rasm->bits;
42+
rizin/librz/core/canalysis.c: if (setBits != core->rasm->bits) {
43+
rizin/librz/core/cmd/cmd_regs.c: if (r->size != core->rasm->bits) {
44+
rizin/librz/core/cmd/cmd_analysis.c: sdb_foreach(core->rasm->pair, listOpDescriptions, core);
45+
rizin/librz/core/cmd/cmd_analysis.c: int i, wordsize = core->rasm->bits / 8;
46+
rizin/librz/core/cmd/cmd_search.c: chunksize = core->rasm->bits / 8;
47+
rizin/librz/core/cmd/cmd_search.c: if (!core->rasm->cur) {
48+
rizin/librz/core/cbin.c: bits = r->rasm->bits;
49+
rizin/librz/core/cbin.c: if (r->rasm->cur) {
50+
rizin/librz/core/cbin.c: arch = r->rasm->cur->arch;
51+
rizin/librz/core/cmd/cmd_print.c: ut64 asm_bits = core->rasm->bits;
52+
rizin/librz/core/cmd/cmd_print.c: opts->size = core->rasm->bits / 8;
53+
rizin/librz/core/cmd/cmd_print.c: switch (core->rasm->bits / 8) {
54+
rizin/librz/core/cmd/cmd_print.c: block += core->rasm->bits / 8;
55+
rizin/librz/core/cmd/cmd_print.c: } else if (core->rasm->bits == 64) {
56+
rizin/librz/core/cmd/cmd_print.c: } else if (core->rasm->bits == 32) {
57+
rizin/librz/core/hack.c: const int bits = core->rasm->bits;
58+
rizin/librz/core/hack.c: const int asmbits = core->rasm->bits;
59+
rizin/librz/core/cmd/cmd.c: if (!rz_io_read_i(core->io, n, &n, core->rasm->bits / 8, core->print->big_endian)) {
60+
rizin/librz/core/cmd/cmd.c: ok = rz_core_write_value_at(core, addr, value, core->rasm->bits / 8);
61+
rizin/librz/core/heap_glibc.c: ut8 bits = (ut8)core->rasm->bits;
62+
rizin/librz/core/cmd/cmd_system.c: const char *endian = rz_str_bool(core->rasm->big_endian);
63+
rizin/librz/core/csyscall.c: if (core->rasm->bits == 32 && core->rasm->cur && !strcmp(core->rasm->cur->arch, "x86")) {
64+
rizin/librz/core/cautocmpl.c: rz_return_if_fail(core->rasm && core->rasm->cur);
65+
rizin/librz/core/cautocmpl.c: autocmplt_bits_plugin(core->rasm->cur, res, s, len);
66+
rizin/librz/core/cfile.c: int bits = core->rasm->bits;
67+
rizin/librz/core/cfile.c: int bits = core->rasm->bits;
68+
rizin/librz/core/cfile.c: rz_sys_setenv("RZ_ENDIAN", core->rasm->big_endian ? "big" : "little");
69+
rizin/librz/core/cfile.c: info->bits = r->rasm->bits;
70+
rizin/librz/core/cfile.c: r->io->bits = r->rasm->bits; // TODO: we need an api for this
71+
rizin/librz/core/cil.c: if (core->rasm->bits == 32 && strstr(core->rasm->cur->name, "arm")) {
72+
rizin/librz/core/core.c: int refsz = core->rasm->bits / 8;
73+
rizin/librz/core/core.c: if (core->rasm && core->rasm->syscall && core->rasm->syscall->db) {
74+
rizin/librz/core/core.c: sdb_ns_set(DB, "syscall", core->rasm->syscall->db);
75+
rizin/librz/core/core.c: const int bits = core->rasm->bits;
76+
rizin/librz/core/core.c: core->rasm->num = core->num;
77+
rizin/librz/core/core.c: core->rasm->core = core;
78+
rizin/librz/core/core.c: core->rasm->syscall = rz_syscall_ref(core->analysis->syscall); // BIND syscall analysis/asm
79+
rizin/librz/core/core.c: rz_bin_bind(core->bin, &(core->rasm->binb));
80+
rizin/librz/core/core.c: switch (core->rasm->bits) {
81+
rizin/librz/core/cconfig.c: RzIterator *it = ht_sp_as_iter(core->rasm->plugins);
82+
rizin/librz/core/cconfig.c: if (core && core->rasm && core->rasm->cur && node) {
83+
rizin/librz/core/cconfig.c: int bits = core->rasm->cur->bits;
84+
rizin/librz/core/cconfig.c: if (core && core->rasm && core->rasm->cur) {
85+
rizin/librz/core/cconfig.c: if (core->rasm->cur->features) {
86+
rizin/librz/core/cconfig.c: char *features = rz_str_dup(core->rasm->cur->features);
87+
rizin/librz/core/cconfig.c: if (core && core->rasm && core->rasm->cur) {
88+
rizin/librz/core/cconfig.c: if (core->rasm->cur->platforms) {
89+
rizin/librz/core/cconfig.c: char *platforms = rz_str_dup(core->rasm->cur->platforms);
90+
rizin/librz/core/cconfig.c: RzIterator *it = ht_sp_as_iter(core->rasm->plugins);
91+
rizin/librz/core/cconfig.c: RZ_FREE(core->rasm->features);
92+
rizin/librz/core/cconfig.c: core->rasm->features = rz_str_dup(node->value);
93+
rizin/librz/core/cconfig.c: core->rasm->pseudo = node->i_value;
94+
rizin/librz/core/cconfig.c: core->rasm->immdisp = node->i_value ? true : false;
95+
rizin/librz/core/cconfig.c: core->rasm->invhex = node->i_value;
96+
rizin/librz/core/cconfig.c: core->rasm->pcalign = align;
97+
rizin/librz/core/cconfig.c: core->rasm->seggrn = node->i_value;
98+
rizin/librz/core/cconfig.c: core->rasm->utf8 = (bool)node->i_value;
99+
rizin/librz/core/tui/visual.c: if ((core->rasm->cur->bits & nb) == nb) {
100+
rizin/librz/core/analysis_objc.c: o->word_size = (core->rasm->bits == 64) ? 8 : 4;
101+
rizin/librz/core/disasm.c: if (core && f && cmt && cmt_size > 0 && f->bits && f->bits != core->rasm->bits) {
102+
rizin/librz/core/disasm.c: const int be = core->rasm->big_endian;
103+
rizin/librz/core/disasm.c: ds->addr = core->rasm->pc;
104+
rizin/librz/core/disasm.c: if (ds->core->rasm->bits == 64) {
105+
rizin/librz/core/disasm.c: int endian = ds->core->rasm->big_endian;
106+
rizin/librz/core/disasm.c: if (ds->core->rasm->bits == 64) {
107+
rizin/librz/core/disasm.c: int obits = ds->core->rasm->bits;
108+
rizin/librz/core/disasm.c: ds->core->rasm->bits = size * 8;
109+
rizin/librz/core/disasm.c: ds->core->rasm->bits = obits;
110+
rizin/librz/core/disasm.c: int mod = ds->asmop.payload % ds->core->rasm->dataalign;
111+
rizin/librz/core/disasm.c: if (ds->core->rasm->bits == 64 && rz_str_startswith(rz_config_get(ds->core->config, "asm.arch"), "arm")) {
112+
rizin/librz/core/disasm.c: if (ds->core->rasm->bits == 64 && rz_str_startswith(rz_config_get(ds->core->config, "asm.arch"), "arm")) {
113+
rizin/librz/core/disasm.c: if (rz_str_cmp(ds->core->rasm->cur->arch, "tricore", -1) == 0) {
114+
rizin/librz/core/disasm.c: // inc = ds->asmop.payload + (ds->asmop.payload % ds->core->rasm->dataalign);
115+
rizin/librz/core/disasm.c: if (core->rasm->syntax != RZ_ASM_SYNTAX_INTEL) {
116+
rizin/librz/core/disasm.c: int os = core->rasm->syntax;
117+
rizin/librz/core/disasm.c: if (core->rasm->syntax != RZ_ASM_SYNTAX_INTEL) {
118+
rizin/librz/core/disasm.c: int os = core->rasm->syntax;
119+
rizin/librz/core/disasm.c: inc += ds->asmop.payload + (ds->asmop.payload % ds->core->rasm->dataalign);
120+
rizin/librz/core/cprint.c: int bitsize = core->rasm->bits;
121+
rizin/librz/core/cprint.c: rz_return_if_fail(core && line && str && core->rasm && core->rasm->cur);
122+
rizin/librz/core/cprint.c: if (strstr(core->rasm->cur->arch, "x86")) {
123+
rizin/librz/core/cprint.c: } else if (strstr(core->rasm->cur->arch, "arm")) {
124+
rizin/librz/core/cprint.c: switch (core->rasm->bits) {
125+
rizin/librz/arch/p/analysis/analysis_hexagon.c: HexState *state = rasm->plugin_data;
126+
rizin/librz/arch/p/analysis/analysis_6502.c: if (rasm && rasm->plugin_data) {
127+
rizin/librz/arch/p/analysis/analysis_6502.c: analysis->plugin_data = rasm->plugin_data;

src/widgets/DecompilerWidget.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -554,29 +554,31 @@ QString DecompilerWidget::formatVarValue(RzAnalysisVar *var)
554554
rz_mem_free(rawVal);
555555
if (typeStr.contains("*")) {
556556
ut64 pointedAddr = 0;
557-
int ptrSize = core->analysis->bits / 8;
558-
bool pointedAddr_state = false;
557+
const int bits = core->rasm->bits;
558+
const int ptrSize = bits / 8;
559559
if (var->storage.type == RZ_ANALYSIS_VAR_STORAGE_REG) {
560560
pointedAddr = rz_debug_reg_get(core->dbg, var->storage.reg);
561-
pointedAddr_state = (pointedAddr != 0);
562561
} else if (var->storage.type == RZ_ANALYSIS_VAR_STORAGE_STACK) {
563562
ut64 stackAddr = rz_core_analysis_var_addr(core, var);
564-
pointedAddr_state =
565-
rz_io_read_at_mapped(core->io, stackAddr, (ut8 *)&pointedAddr, ptrSize);
563+
ut8 ptrBuf[8];
564+
if (rz_io_read_at_mapped(core->io, stackAddr, ptrBuf, ptrSize)) {
565+
pointedAddr = rz_read_ble(ptrBuf, core->rasm->big_endian, bits);
566+
}
566567
}
567-
if (pointedAddr_state && pointedAddr) {
568+
if (pointedAddr) {
568569
ut8 buf[256];
569570
bool str_state = rz_io_read_at_mapped(core->io, pointedAddr, buf, sizeof(buf) - 1);
570571
if (str_state) {
571572
size_t len = strnlen((const char *)buf, sizeof(buf));
572573
if (len > 0 && rz_str_is_printable((const char *)buf)) {
573-
QString str = QString::fromUtf8((const char *)buf, len);
574+
QString str = QString::fromUtf8((const char *)buf, len).toHtmlEscaped();
574575
displayValue += QString("\nvalue: \"%1\"").arg(str);
575576
}
576577
}
577578
}
578579
}
579-
return QString("%1 (%2)\nValue: %3").arg(QString::fromUtf8(var->name), typeStr, displayValue);
580+
return QString("%1 (%2)\nValue: %3")
581+
.arg(QString::fromUtf8(var->name).toHtmlEscaped(), typeStr, displayValue);
580582
}
581583

582584
bool DecompilerWidget::eventFilter(QObject *obj, QEvent *event)

0 commit comments

Comments
 (0)