Fixes for variables and arguments diplay in disasm (#3561)

* Remove ConsoleTheme from disasm.c
* Add `rz_core_analysis_var_to_string()` API method
* Avoid variable overriding arguments
* Fix tests
This commit is contained in:
billow 2023-06-08 17:22:07 +08:00 committed by GitHub
parent 099439fcb3
commit 6f3969f8c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 442 additions and 335 deletions

View file

@ -0,0 +1,11 @@
// SPDX-FileCopyrightText: 2023 billow <billow.fun@gmail.com>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RZ_ANALYSIS_PRIVATE_H
#define RZ_ANALYSIS_PRIVATE_H
#include <rz_analysis.h>
RZ_IPI RZ_BORROW RzAnalysisVar *rz_analysis_function_add_var_dwarf(RzAnalysisFunction *fcn, RZ_OWN RzAnalysisVar *var, int size);
#endif // RZ_ANALYSIS_PRIVATE_H

View file

@ -7,6 +7,7 @@
#include <rz_analysis.h>
#include <rz_bin_dwarf.h>
#include <string.h>
#include "analysis_private.h"
typedef struct dwarf_parse_context_t {
const RzAnalysis *analysis;
@ -1700,7 +1701,6 @@ static bool apply_debuginfo_variable(FcnVariableCtx *ctx, const char *var_name,
offset = strtol(extra, NULL, 10);
}
bool ret = false;
if (*kind == 'g') { /* global, fixed addr TODO add size to variables? */
char *global_name = rz_str_newf("global_%s", var_name);
rz_flag_unset_off(ctx->flags, offset);
@ -1712,9 +1712,6 @@ static bool apply_debuginfo_variable(FcnVariableCtx *ctx, const char *var_name,
}
RzAnalysisVar var;
memset(&var, 0, sizeof(RzAnalysisVar));
var.name = strdup(var_name);
var.type = ttype;
var.kind = (RzAnalysisVarKind)var_kind;
if (*kind == 'r') {
RzRegItem *i = rz_reg_get(ctx->analysis->reg, extra, -1);
if (!i) {
@ -1728,12 +1725,16 @@ static bool apply_debuginfo_variable(FcnVariableCtx *ctx, const char *var_name,
}
rz_analysis_var_storage_init_stack(&var.storage, addr);
}
rz_analysis_function_add_var(ctx->fcn, &var, 4);
ret = true;
var.type = ttype;
var.kind = var_kind;
var.name = rz_str_new(var_name);
var.fcn = ctx->fcn;
rz_analysis_function_add_var_dwarf(ctx->fcn, &var, 4);
}
return true;
beach:
rz_type_free(ttype);
return ret;
return false;
}
static void apply_debuginfo_variables(FcnVariableCtx *ctx, RzAnalysisVarKind kind) {

View file

@ -120,7 +120,7 @@ RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_set_var(RzAnalysisFunction
RzAnalysisVar *var = rz_analysis_function_get_var_byname(fcn, name);
if (var && !storage_equals(&var->storage, stor)) {
// var name already exists at a different kind+delta
RZ_LOG_WARN("var name %s already exists at a different kind+delta", name);
RZ_LOG_WARN("var name %s already exists at a different kind+delta\n", name);
return NULL;
}
var = rz_analysis_function_get_var_at(fcn, stor);
@ -151,21 +151,57 @@ RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_set_var(RzAnalysisFunction
}
/**
* Add or update a variable \p var to the given function \p fcn.
* \brief Add or update a variable \p var to the given function \p fcn.
*
* For the variable information in DWARF, there may be some variables whose location information is the same
* but other information may be completely different.
* The current approach to this situation is to add all FORMAL_PARAMETER variables first, and then add the others
* but don't overwrite any already added variables from DWARF. This assumes that for all FORMAL_PARAMETER variables
* of a function, there is no overlap in their locations.
*
* \param fcn the function which the variable will belong to
* \param var the variable to add or update
* \param size \p var's type size
* \return the created or updated variable, or NULL if the operation could not be completed
*/
RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_add_var(RzAnalysisFunction *fcn, RZ_OWN RzAnalysisVar *var,
RZ_IPI RZ_BORROW RzAnalysisVar *rz_analysis_function_add_var_dwarf(RzAnalysisFunction *fcn, RZ_OWN RzAnalysisVar *var,
int size) {
rz_return_val_if_fail(fcn && var && var->name, NULL);
RzAnalysisVar *p_var = rz_analysis_function_set_var(fcn, &var->storage, var->type, size, var->name);
if (p_var) {
p_var->kind = var->kind;
RzAnalysisVar *old = NULL;
void **it;
rz_pvector_foreach (&fcn->vars, it) {
RzAnalysisVar *p = *it;
if (!strcmp(p->name, var->name) || storage_equals(&p->storage, &var->storage)) {
old = p;
}
}
return p_var;
if (old) {
if (old->kind != RZ_ANALYSIS_VAR_KIND_INVALID) {
return NULL;
}
rz_analysis_var_delete(old);
}
RzAnalysisVar *out = rz_analysis_var_new();
out->fcn = fcn;
rz_pvector_push(&fcn->vars, out);
out->name = var->name;
out->storage = var->storage;
out->kind = var->kind;
storage_poolify(fcn->analysis, &out->storage);
if (var->type) {
if (out->type != var->type) {
rz_type_free(out->type);
out->type = rz_type_clone(var->type);
}
} else {
if (!out->type) {
out->type = var_type_default(fcn->analysis, size);
}
}
rz_analysis_var_resolve_overlaps(out);
return out;
}
RZ_API void rz_analysis_var_set_type(RzAnalysisVar *var, RZ_OWN RzType *type, bool resolve_overlaps) {

View file

@ -6466,3 +6466,49 @@ finish:
rz_cons_break_pop();
RZ_FREE(debugger);
}
/**
* \brief Get string representation of RzAnalysisVar.
*
* \param core RzCore instance
* \param var RzAnalysisVar to be converted to string
*/
RZ_API RZ_OWN char *rz_core_analysis_var_to_string(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var) {
RzStrBuf *sb = rz_strbuf_new(NULL);
if (!sb) {
return NULL;
}
bool color = rz_config_get_b(core->config, "scr.color");
bool color_arg = color && rz_config_get_b(core->config, "scr.color.args");
RzConsPrintablePalette *pal = &core->cons->context->pal;
const char *pfx = rz_analysis_var_is_arg(var) ? "arg" : "var";
char *constr = rz_analysis_var_get_constraints_readable(var);
char *vartype = rz_type_as_string(core->analysis->typedb, var->type);
rz_strbuf_appendf(sb, "%s%s %s%s%s%s %s%s%s%s@ ",
color_arg ? pal->func_var : "", pfx,
color_arg ? pal->func_var_type : "", vartype,
rz_str_endswith(vartype, "*") ? "" : " ",
var->name,
color_arg ? pal->func_var_addr : "",
constr ? " { " : "",
constr ? constr : "",
constr ? "} " : "");
free(vartype);
free(constr);
switch (var->storage.type) {
case RZ_ANALYSIS_VAR_STORAGE_REG: {
rz_strbuf_append(sb, var->storage.reg);
break;
}
case RZ_ANALYSIS_VAR_STORAGE_STACK: {
const RzStackAddr off = var->storage.stack_off;
const char sign = off >= 0 ? '+' : '-';
rz_strbuf_appendf(sb, "stack %c 0x%" PFMT64x, sign, RZ_ABS(off));
break;
}
}
return rz_strbuf_drain(sb);
}

View file

@ -2506,7 +2506,7 @@ static int var_comparator(const RzAnalysisVar *a, const RzAnalysisVar *b) {
}
}
static void core_analysis_var_list_show(RzAnalysis *analysis, RzAnalysisFunction *fcn, RzAnalysisVarStorageType kind, RzCmdStateOutput *state) {
static void core_analysis_var_list_show(RzCore *core, RzAnalysisFunction *fcn, RzAnalysisVarStorageType kind, RzCmdStateOutput *state) {
RzAnalysisVar *var;
RzListIter *iter;
if (state->mode == RZ_OUTPUT_MODE_JSON) {
@ -2524,7 +2524,7 @@ static void core_analysis_var_list_show(RzAnalysis *analysis, RzAnalysisFunction
switch (state->mode) {
case RZ_OUTPUT_MODE_RIZIN: {
// we can't express all type info here :(
char *vartype = rz_type_as_string(analysis->typedb, var->type);
char *vartype = rz_type_as_string(core->analysis->typedb, var->type);
switch (kind) {
case RZ_ANALYSIS_VAR_STORAGE_REG:
rz_cons_printf("afvr %s %s %s @ 0x%" PFMT64x "\n",
@ -2543,7 +2543,7 @@ static void core_analysis_var_list_show(RzAnalysis *analysis, RzAnalysisFunction
break;
}
case RZ_OUTPUT_MODE_JSON: {
char *vartype = rz_type_as_string(analysis->typedb, var->type);
char *vartype = rz_type_as_string(core->analysis->typedb, var->type);
pj_o(state->d.pj);
pj_ks(state->d.pj, "name", var->name);
pj_kb(state->d.pj, "arg", rz_analysis_var_is_arg(var));
@ -2568,25 +2568,14 @@ static void core_analysis_var_list_show(RzAnalysis *analysis, RzAnalysisFunction
free(vartype);
break;
}
default:
switch (kind) {
case RZ_ANALYSIS_VAR_STORAGE_STACK: {
st64 delta = var->storage.stack_off;
char *vartype = rz_type_as_string(analysis->typedb, var->type);
char sign = delta < 0 ? '-' : '+';
rz_cons_printf("%s %s %s @ stack %c 0x%" PFMT64x "\n",
rz_analysis_var_is_arg(var) ? "arg" : "var",
vartype, var->name,
sign, RZ_ABS(delta));
free(vartype);
} break;
case RZ_ANALYSIS_VAR_STORAGE_REG: {
char *vartype = rz_type_as_string(analysis->typedb, var->type);
rz_cons_printf("arg %s %s @ %s\n", vartype, var->name, var->storage.reg);
free(vartype);
} break;
default: {
char *s = rz_core_analysis_var_to_string(core, var);
if (s) {
rz_cons_println(s);
free(s);
}
}
}
}
fail:
if (state->mode == RZ_OUTPUT_MODE_JSON) {
@ -2604,8 +2593,8 @@ RZ_IPI RzCmdStatus rz_analysis_function_vars_handler(RzCore *core, int argc, con
const char *bp = NULL;
switch (state->mode) {
case RZ_OUTPUT_MODE_STANDARD:
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
break;
case RZ_OUTPUT_MODE_RIZIN: {
bp = rz_reg_get_name(core->analysis->reg, RZ_REG_NAME_BP);
@ -2624,9 +2613,9 @@ RZ_IPI RzCmdStatus rz_analysis_function_vars_handler(RzCore *core, int argc, con
case RZ_OUTPUT_MODE_JSON:
pj_o(state->d.pj);
pj_k(state->d.pj, "stack");
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
pj_k(state->d.pj, "reg");
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
pj_end(state->d.pj);
break;
default:
@ -2873,7 +2862,7 @@ RZ_IPI RzCmdStatus rz_analysis_function_vars_xrefs_vars_handler(RzCore *core, in
}
static RzCmdStatus analysis_function_vars_kind_list(RzCore *core, RzAnalysisFunction *fcn, RzAnalysisVarStorageType kind, RzCmdStateOutput *state) {
core_analysis_var_list_show(core->analysis, fcn, kind, state);
core_analysis_var_list_show(core, fcn, kind, state);
return RZ_CMD_STATUS_OK;
}
@ -3583,8 +3572,8 @@ static void function_list_print_as_cmd(RzCore *core, RzList /*<RzAnalysisFunctio
rz_cons_printf("afc %s @ 0x%08" PFMT64x "\n", fcn->cc ? fcn->cc : defaultCC, fcn->addr);
}
/* show variables and arguments */
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
/* Show references */
RzList *xrefs = rz_analysis_function_get_xrefs_from(fcn);
xref_list_print_as_cmd(core, xrefs);
@ -3692,9 +3681,9 @@ static void function_print_to_json(RzCore *core, RzAnalysisFunction *fcn, RzCmdS
pj_kn(state->d.pj, "nargs", rz_analysis_arg_count(fcn));
pj_k(state->d.pj, "stackvars");
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
pj_k(state->d.pj, "regvars");
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
}
pj_end(state->d.pj);
}
@ -3968,8 +3957,8 @@ static void fcn_print_info(RzCore *core, RzAnalysisFunction *fcn, RzCmdStateOutp
ut32 var_count = rz_analysis_var_local_count(fcn);
rz_cons_printf("locals: %u\nargs: %u\n", var_count, args_count);
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
core_analysis_var_list_show(core->analysis, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_REG, state);
core_analysis_var_list_show(core, fcn, RZ_ANALYSIS_VAR_STORAGE_STACK, state);
}
// traced

View file

@ -17,8 +17,8 @@
#define DEFAULT_NARGS 4
#define FLAG_PREFIX ";-- "
#define COLOR(ds, field) ((ds)->show_color ? (ds)->theme.field : "")
#define COLOR_ARG(ds, field) ((ds)->show_color && (ds)->show_color_args ? (ds)->theme.field : "")
#define COLOR(ds, field) ((ds)->show_color ? (ds)->core->cons->context->pal.field : "")
#define COLOR_ARG(ds, field) ((ds)->show_color && (ds)->show_color_args ? (ds)->core->cons->context->pal.field : "")
#define COLOR_CONST(ds, color) ((ds)->show_color ? Color_##color : "")
#define COLOR_RESET(ds) COLOR_CONST(ds, RESET)
@ -76,47 +76,6 @@ static const char *rz_vline_uc[] = {
"@", // SELF_LOOP
};
typedef struct console_theme_t {
const char *pal_comment;
const char *comment;
const char *usrcmt;
const char *fname;
const char *floc;
const char *fline;
const char *flow;
const char *flow2;
const char *flag;
const char *label;
const char *offset;
const char *other;
const char *nop;
const char *bin;
const char *math;
const char *btext;
const char *jmp;
const char *cjmp;
const char *call;
const char *cmp;
const char *swi;
const char *trap;
const char *ret;
const char *push;
const char *pop;
const char *reg;
const char *num;
const char *mov;
const char *invalid;
const char *gui_cflow;
const char *gui_dataoffset;
const char *gui_background;
const char *gui_alt_background;
const char *gui_border;
const char *linehl;
const char *func_var;
const char *func_var_type;
const char *func_var_addr;
} ConsoleTheme;
#define DS_PRE_NONE 0
#define DS_PRE_EMPTY 1
#define DS_PRE_FCN_HEAD 2
@ -251,7 +210,6 @@ typedef struct {
bool midcursor;
bool show_noisy_comments;
ut64 asm_highlight;
ConsoleTheme theme;
RzFlagItem *lastflag;
RzAnalysisHint *hint;
@ -378,85 +336,6 @@ static void ds_start_line_highlight(RzDisasmState *ds);
static void ds_end_line_highlight(RzDisasmState *ds);
static bool line_highlighted(RzDisasmState *ds);
static int ds_print_shortcut(RzDisasmState *ds, ut64 addr, int pos);
static inline void ds_init_theme(RzDisasmState *ds) {
RzCore *core = ds->core;
ds->theme.pal_comment = core->cons->context->pal.comment;
#define P(x) (core->cons && core->cons->context->pal.x) ? core->cons->context->pal.x
ds->theme.comment = P(comment)
: Color_CYAN;
ds->theme.usrcmt = P(usercomment)
: Color_CYAN;
ds->theme.fname = P(fname)
: Color_RED;
ds->theme.floc = P(floc)
: Color_MAGENTA;
ds->theme.fline = P(fline)
: Color_CYAN;
ds->theme.flow = P(flow)
: Color_CYAN;
ds->theme.flow2 = P(flow2)
: Color_BLUE;
ds->theme.flag = P(flag)
: Color_CYAN;
ds->theme.label = P(label)
: Color_CYAN;
ds->theme.offset = P(offset)
: Color_GREEN;
ds->theme.other = P(other)
: Color_WHITE;
ds->theme.nop = P(nop)
: Color_BLUE;
ds->theme.bin = P(bin)
: Color_YELLOW;
ds->theme.math = P(math)
: Color_YELLOW;
ds->theme.btext = P(btext)
: Color_YELLOW;
ds->theme.jmp = P(jmp)
: Color_GREEN;
ds->theme.cjmp = P(cjmp)
: Color_GREEN;
ds->theme.call = P(call)
: Color_BGREEN;
ds->theme.cmp = P(cmp)
: Color_MAGENTA;
ds->theme.swi = P(swi)
: Color_MAGENTA;
ds->theme.trap = P(trap)
: Color_BRED;
ds->theme.ret = P(ret)
: Color_RED;
ds->theme.push = P(push)
: Color_YELLOW;
ds->theme.pop = P(pop)
: Color_BYELLOW;
ds->theme.reg = P(reg)
: Color_YELLOW;
ds->theme.num = P(num)
: Color_CYAN;
ds->theme.mov = P(mov)
: Color_WHITE;
ds->theme.invalid = P(invalid)
: Color_BRED;
ds->theme.gui_cflow = P(gui_cflow)
: Color_YELLOW;
ds->theme.gui_dataoffset = P(gui_dataoffset)
: Color_YELLOW;
ds->theme.gui_background = P(gui_background)
: Color_BLACK;
ds->theme.gui_alt_background = P(gui_alt_background)
: Color_GRAY;
ds->theme.gui_border = P(gui_border)
: Color_BGGRAY;
ds->theme.linehl = P(linehl)
: Color_BGBLUE;
ds->theme.func_var = P(func_var)
: Color_WHITE;
ds->theme.func_var_type = P(func_var_type)
: Color_BLUE;
ds->theme.func_var_addr = P(func_var_addr)
: Color_CYAN;
}
#define theme_printf(kwd, fmt, ...) rz_cons_printf("%s" fmt "%s", COLOR(ds, kwd), __VA_ARGS__, COLOR_RESET(ds))
#define theme_print(kwd, x) \
@ -590,7 +469,7 @@ RZ_API const char *rz_core_get_section_name(RzCore *core, ut64 addr) {
// nl if we have to insert new line, it controls whether to insert \n
static void _ds_comment_align_(RzDisasmState *ds, bool up, bool nl) {
if (ds->show_comment_right) {
theme_print_color(pal_comment);
theme_print_color(comment);
return;
}
const char *sn = ds->show_section ? rz_core_get_section_name(ds->core, ds->at) : "";
@ -698,10 +577,6 @@ static RzDisasmState *ds_init(RzCore *core) {
ds->colorop = rz_config_get_b(core->config, "scr.color.ops"); // XXX confusing name // asm.color.inst (mnemonic + operands) ?
ds->show_utf8 = rz_config_get_b(core->config, "scr.utf8");
if (ds->show_color) {
ds_init_theme(ds);
}
ds->immstr = rz_config_get_b(core->config, "asm.imm.str");
ds->immtrim = rz_config_get_b(core->config, "asm.imm.trim");
ds->use_esil = rz_config_get_b(core->config, "asm.esil");
@ -988,7 +863,7 @@ static bool ds_must_strip(RzDisasmState *ds) {
static void ds_highlight_word(RzDisasmState *ds, char *word, char *color) {
char *source = ds->opstr ? ds->opstr : rz_asm_op_get_asm(&ds->asmop);
const char *color_reset = line_highlighted(ds) ? ds->theme.linehl : Color_RESET_BG;
const char *color_reset = line_highlighted(ds) ? COLOR(ds, linehl) : Color_RESET_BG;
char *asm_str = rz_str_highlight(source, word, color, color_reset);
ds->opstr = asm_str ? asm_str : source;
}
@ -1427,7 +1302,7 @@ static void ds_show_xrefs(RzDisasmState *ds) {
ds_begin_line(ds);
ds_pre_xrefs(ds, fcnlines);
ds_comment(ds, false, "%s; XREFS(%d)",
COLOR(ds, pal_comment),
COLOR(ds, comment),
rz_list_length(xrefs));
ds_print_color_reset(ds);
ds_newline(ds);
@ -1441,7 +1316,7 @@ static void ds_show_xrefs(RzDisasmState *ds) {
cols = cols > 5 ? 5 : cols;
ds_begin_line(ds);
ds_pre_xrefs(ds, fcnlines);
ds_comment(ds, false, "%s; XREFS: ", COLOR(ds, pal_comment));
ds_comment(ds, false, "%s; XREFS: ", COLOR(ds, comment));
rz_list_foreach (xrefs, iter, xrefi) {
ds_comment(ds, false, "%s 0x%08" PFMT64x " ",
rz_analysis_xrefs_type_tostring(xrefi->type), xrefi->from);
@ -1451,7 +1326,7 @@ static void ds_show_xrefs(RzDisasmState *ds) {
ds_newline(ds);
ds_begin_line(ds);
ds_pre_xrefs(ds, fcnlines);
ds_comment(ds, false, "%s; XREFS: ", COLOR(ds, pal_comment));
ds_comment(ds, false, "%s; XREFS: ", COLOR(ds, comment));
}
count = 0;
} else {
@ -1507,7 +1382,7 @@ static void ds_show_xrefs(RzDisasmState *ds) {
const char *plural = rz_list_length(addrs) > 1 ? "S" : "";
const char *plus = fun ? "" : "+";
ds_comment(ds, false, "%s; %s XREF%s from %s @ ",
COLOR(ds, pal_comment), rz_analysis_xrefs_type_tostring(xrefi->type), plural,
COLOR(ds, comment), rz_analysis_xrefs_type_tostring(xrefi->type), plural,
realname ? realname : name);
ut64 *addrptr;
rz_list_foreach (addrs, it, addrptr) {
@ -1782,32 +1657,10 @@ static void ds_pre_xrefs(RzDisasmState *ds, bool no_fcnlines) {
}
static void ds_show_function_var(RzDisasmState *ds, RzAnalysisFunction *fcn, RzAnalysisVar *var) {
const char *pfx = rz_analysis_var_is_arg(var) ? "arg" : "var";
char *constr = rz_analysis_var_get_constraints_readable(var);
char *vartype = rz_type_as_string(ds->core->analysis->typedb, var->type);
rz_cons_printf("%s%s %s%s%s%s %s%s%s%s@ ",
COLOR_ARG(ds, func_var), pfx,
COLOR_ARG(ds, func_var_type), vartype,
rz_str_endswith(vartype, "*") ? "" : " ",
var->name, COLOR_ARG(ds, func_var_addr),
constr ? " { " : "",
constr ? constr : "",
constr ? "} " : "");
free(vartype);
free(constr);
theme_print_color(func_var_addr);
switch (var->storage.type) {
case RZ_ANALYSIS_VAR_STORAGE_REG: {
rz_cons_print(var->storage.reg);
break;
}
case RZ_ANALYSIS_VAR_STORAGE_STACK: {
const RzStackAddr off = var->storage.stack_off;
const char sign = off >= 0 ? '+' : '-';
rz_cons_printf("stack %c 0x%" PFMT64x, sign, RZ_ABS(off));
break;
}
char *s = rz_core_analysis_var_to_string(ds->core, var);
if (s) {
rz_cons_print(s);
free(s);
}
if (ds->show_varsum != -1) {
@ -1898,10 +1751,6 @@ static void printVarSummary(RzDisasmState *ds, RzList /*<RzAnalysisVar *>*/ *lis
ds_newline(ds);
}
static bool empty_signature(const char *s) {
return (s && !strncmp(s, "void ", 5) && strstr(s, "()"));
}
static void ds_show_functions(RzDisasmState *ds) {
RzAnalysisFunction *f;
RzCore *core = ds->core;
@ -1920,10 +1769,6 @@ static void ds_show_functions(RzDisasmState *ds) {
fcn_name = f->name;
ds_begin_line(ds);
char *sign = rz_analysis_function_get_signature(f);
if (empty_signature(sign)) {
RZ_FREE(sign);
}
RzAnalysisFcnVarsCache vars_cache;
rz_analysis_fcn_vars_cache_init(core->analysis, &vars_cache, f);
@ -1997,7 +1842,6 @@ static void ds_show_functions(RzDisasmState *ds) {
rz_cons_printf("%s", fcn_name);
}
ds_newline(ds);
RZ_FREE(sign);
if (ds->show_lines_fcn) {
ds->pre = DS_PRE_FCN_MIDDLE;
@ -2172,9 +2016,9 @@ static void ds_show_comments_right(RzDisasmState *ds) {
ds->comment = strdup(item->comment);
}
} else if (vartype) {
ds->comment = rz_str_newf("%s; %s %s%s; %s", COLOR_ARG(ds, func_var_type), vartype, COLOR_RESET(ds), COLOR(ds, usrcmt), comment);
ds->comment = rz_str_newf("%s; %s %s%s; %s", COLOR_ARG(ds, func_var_type), vartype, COLOR_RESET(ds), COLOR(ds, usercomment), comment);
} else {
ds->comment = rz_str_newf("%s; %s", COLOR_ARG(ds, usrcmt), comment);
ds->comment = rz_str_newf("%s; %s", COLOR_ARG(ds, usercomment), comment);
}
if (!ds->comment || !*ds->comment) {
return;
@ -2194,10 +2038,10 @@ static void ds_show_comments_right(RzDisasmState *ds) {
mycols = 0;
}
mycols /= 2;
theme_print_color(pal_comment);
theme_print_color(comment);
ds_pre_xrefs(ds, false);
theme_print_color(usrcmt);
theme_print_color(usercomment);
ds_comment(ds, false, "%s", ds->comment);
ds_print_color_reset(ds);
@ -2206,7 +2050,7 @@ static void ds_show_comments_right(RzDisasmState *ds) {
/* flag one */
if (item && item->comment && ds->ocomment != item->comment) {
ds_begin_line(ds);
theme_print_color(pal_comment);
theme_print_color(comment);
ds_newline(ds);
ds_begin_line(ds);
rz_cons_strcat(" ; ");
@ -2243,7 +2087,7 @@ static void __preline_flag(RzDisasmState *ds, RzFlagItem *flag) {
}
}
if (!hasColor) {
rz_cons_strcat(ds->theme.flag);
rz_cons_strcat(COLOR(ds, flag));
}
}
if (!ds->show_offset) {
@ -2335,7 +2179,7 @@ static void ds_show_flags(RzDisasmState *ds, bool overlapped) {
}
}
if (!hasColor) {
rz_cons_strcat(ds->theme.flag);
rz_cons_strcat(COLOR(ds, flag));
}
}
@ -2403,7 +2247,7 @@ static void ds_show_flags(RzDisasmState *ds, bool overlapped) {
}
case_prev = case_current;
ds_align_comment(ds);
rz_cons_printf("%s; from %s", COLOR(ds, pal_comment), addr);
rz_cons_printf("%s; from %s", COLOR(ds, comment), addr);
outline = false;
docolon = false;
} else {
@ -2414,7 +2258,7 @@ static void ds_show_flags(RzDisasmState *ds, bool overlapped) {
rz_cons_printf(FLAG_PREFIX);
if (overlapped) {
rz_cons_printf("%s(0x%08" PFMT64x ")%s ", COLOR(ds, offset), ds->at,
ds->show_color ? (hasColor ? color : ds->theme.flag) : "");
ds->show_color ? (hasColor ? color : COLOR(ds, flag)) : "");
}
}
if (outline) {
@ -2666,7 +2510,7 @@ static void ds_control_flow_comments(RzDisasmState *ds) {
case RZ_ANALYSIS_OP_TYPE_CALL:
item = rz_flag_get_i(ds->core->flags, ds->analysis_op.jump);
if (item && item->comment) {
theme_print_color(pal_comment);
theme_print_color(comment);
ds_align_comment(ds);
rz_cons_printf(" ; ref to %s: %s\n", item->name, item->comment);
ds_print_color_reset(ds);
@ -2737,7 +2581,7 @@ static void ds_print_lines_left(RzDisasmState *ds) {
}
}
char *sect = str ? str : strdup("");
printCol(ds, sect, ds->show_section_col, ds->theme.reg);
printCol(ds, sect, ds->show_section_col, COLOR(ds, reg));
free(sect);
}
if (ds->show_symbols) {
@ -2762,7 +2606,7 @@ static void ds_print_lines_left(RzDisasmState *ds) {
}
{
char *str = rz_str_newf("%s + %-4d", name, delta);
printCol(ds, str, ds->show_symbols_col, ds->theme.num);
printCol(ds, str, ds->show_symbols_col, COLOR(ds, num));
free(str);
}
}
@ -3031,7 +2875,7 @@ static bool ds_print_data_type(RzDisasmState *ds, const ut8 *buf, int ib, int si
}
}
rz_cons_strcat(ds->theme.mov);
rz_cons_strcat(COLOR(ds, mov));
switch (ib) {
case 1:
rz_str_bits(msg, buf, size * 8, NULL);
@ -3423,7 +3267,7 @@ static int ds_print_middle(RzDisasmState *ds, int ret) {
if (ds->middle != 0) {
ret -= ds->middle;
ds_align_comment(ds);
theme_printf(pal_comment, " ; *middle* %d", ret);
theme_printf(comment, " ; *middle* %d", ret);
}
return ret;
}
@ -3542,7 +3386,7 @@ static int ds_print_shortcut(RzDisasmState *ds, ut64 addr, int pos) {
if (ds->asm_hint_pos == -1) {
ch = " ";
}
theme_print_color(pal_comment);
theme_print_color(comment);
if (*ch) {
slen++;
}
@ -3732,7 +3576,7 @@ static void ds_begin_nl_comment(RzDisasmState *ds) {
ds_pre_xrefs(ds, false);
}
if (ds->show_color && (ds->cmtcount > 0 || ds->show_comment_right)) {
theme_print_color(pal_comment);
theme_print_color(comment);
}
}
@ -3784,7 +3628,7 @@ static void ds_print_debuginfo(RzDisasmState *ds) {
return;
}
ds_align_comment(ds);
theme_printf(pal_comment, "; %s", line);
theme_printf(comment, "; %s", line);
free(ds->osl);
ds->osl = ds->sl;
ds->sl = NULL;
@ -4684,7 +4528,7 @@ static void ds_print_esil_analysis(RzDisasmState *ds) {
if (!can_emulate_metadata(core, at)) {
goto beach;
}
theme_print_color(pal_comment);
theme_print_color(comment);
esil = core->analysis->esil;
pc = rz_reg_get_name(core->analysis->reg, RZ_REG_NAME_PC);
if (pc) {
@ -4780,7 +4624,7 @@ static void ds_print_esil_analysis(RzDisasmState *ds) {
// remove other comments
delete_last_comment(ds);
// ds_comment_start (ds, "");
ds_comment_esil(ds, true, false, "%s", COLOR(ds, pal_comment));
ds_comment_esil(ds, true, false, "%s", COLOR(ds, comment));
char *fcn_type_str = NULL;
if (fcn_type) {
fcn_type_str = rz_type_as_string(core->analysis->typedb, fcn_type);
@ -4842,7 +4686,7 @@ static void ds_print_esil_analysis(RzDisasmState *ds) {
nargs = rz_analysis_arg_count(fcn);
}
if (nargs > 0) {
ds_comment_esil(ds, true, false, "%s", COLOR(ds, pal_comment));
ds_comment_esil(ds, true, false, "%s", COLOR(ds, comment));
if (fcn_name) {
ds_comment_middle(ds, "; %s(", fcn_name);
} else {
@ -4979,7 +4823,7 @@ static void ds_print_comments_right(RzDisasmState *ds) {
for (i = 0; i < lines_count; i++) {
char *c = comment + line_indexes[i];
ds_print_pre(ds, true);
theme_print_color(usrcmt);
theme_print_color(usercomment);
rz_cons_printf(i == 0 ? "%s" : "; %s", c);
if (i < lines_count - 1) {
ds_newline(ds);
@ -5010,7 +4854,7 @@ static void ds_print_comments_right(RzDisasmState *ds) {
static void ds_print_as_string(RzDisasmState *ds) {
char *str = rz_num_as_string(NULL, ds->analysis_op.ptr, true);
if (str) {
ds_comment(ds, false, "%s; \"%s\"%s", COLOR(ds, pal_comment),
ds_comment(ds, false, "%s; \"%s\"%s", COLOR(ds, comment),
str, COLOR_RESET(ds));
}
free(str);
@ -5167,7 +5011,7 @@ static bool line_highlighted(RzDisasmState *ds) {
static void ds_start_line_highlight(RzDisasmState *ds) {
if (ds->show_color && line_highlighted(ds)) {
rz_cons_strcat(ds->theme.linehl);
rz_cons_strcat(COLOR(ds, linehl));
}
}

View file

@ -806,7 +806,7 @@ typedef struct rz_analysis_op_t {
st64 stackptr; /* stack pointer */
int refptr; /* if (0) ptr = "reference" else ptr = "load memory of refptr bytes" */
ut64 mmio_address; // mmio address
RzAnalysisValue *src[3];
RzAnalysisValue *src[6];
RzAnalysisValue *dst;
RzList /*<RzAnalysisValue *>*/ *access; /* RzAnalysisValue access information */
RzStrBuf esil;
@ -1648,7 +1648,6 @@ RZ_API RzList /*<RzAnalysisFunction *>*/ *rz_analysis_get_fcns(RzAnalysis *analy
/* var.c */
RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_set_var(RzAnalysisFunction *fcn, RZ_NONNULL RzAnalysisVarStorage *stor, RZ_BORROW RZ_NULLABLE const RzType *type, int size, RZ_NONNULL const char *name);
RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_add_var(RzAnalysisFunction *fcn, RZ_OWN RzAnalysisVar *var, int size);
RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_get_var_at(RzAnalysisFunction *fcn, RZ_NONNULL RzAnalysisVarStorage *stor);
RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_get_stack_var_at(RzAnalysisFunction *fcn, RzStackAddr stack_off);
RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_get_reg_var_at(RzAnalysisFunction *fcn, RZ_NONNULL const char *reg);

View file

@ -1281,6 +1281,8 @@ RZ_API RZ_OWN RzList /*<RzRegItem *>*/ *rz_core_reg_filter_items_sync(RZ_NONNULL
RZ_API void rz_core_cmd_show_analysis_help(RZ_NONNULL RzCore *core);
RZ_API void rz_core_rtr_enable(RZ_NONNULL RzCore *core, const char *cmdremote);
RZ_API RZ_OWN char *rz_core_analysis_var_to_string(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var);
#endif
#ifdef __cplusplus

View file

@ -332,7 +332,7 @@ afv
EOF
EXPECT=<<EOF
arg int64_t arg3 @ r8
arg const char * s @ rcx
arg const char *s @ rcx
arg int64_t arg2 @ rdx
EOF
RUN
@ -930,7 +930,186 @@ EXPECT=<<EOF
| 0x800004a4 st.w [a15]16, d3
| 0x800004a6 mov d15, 1 ; float_ex1.c:24
| 0x800004a8 mov d2, d15 ; float_ex1.c:25
| 0x800004aa ret
| 0x800004aa ret
EOF
NAME=Function va_args arguments from DWARF
FILE=bins/elf/float_ex1/float_ex1_hightec
CMDS=<<EOF
aaa
(sig; afv; afs; pd 1; echo "---------")
s dbg.printf
.(sig)
s dbg.prout
.(sig)
s dbg._fpadd_parts
.(sig)
s dbg.strnlen_s
.(sig)
s dbg._Wctomb
.(sig)
s dbg._Mbtowc
.(sig)
s dbg.feraiseexcept
.(sig)
s dbg._Atrealloc
.(sig)
EOF
EXPECT=<<EOF
var va_list ap @ stack + 0x4
arg const char *fmt @ a6
int printf(const char *format);
;-- printf:
/ int dbg.printf(const char *fmt, va_args ..);
| ; arg const char *fmt @ a6
| ; var va_list ap @ stack + 0x4
| 0x80000c22 mov.aa a6, a4 ; printf.c:10 ; int printf(const char *fmt, va_args ..);
---------
arg void *str @ a15
arg const char *buf @ a5
arg size_t n @ d4
void dbg.prout(const char *buf);
;-- prout:
/ void *dbg.prout(void *str, const char *buf, size_t n);
| ; arg void *str @ a15
| ; arg size_t n @ d4
| ; arg const char *buf @ a5
| 0x80000c04 mov.aa a15, a4 ; printf.c:5 ; void *prout(void *str, const char *buf, size_t n);
---------
arg fp_number_type *b @ a12
arg fp_number_type *a @ a13
arg fp_number_type *tmp @ a15
var fractype a_fraction @ d11
var int diff @ d12
var int a_normal_exp @ d15
var int b_normal_exp @ d2
var intfrac tfraction @ d3
var fractype b_fraction @ d9
void dbg._fpadd_parts();
;-- _fpadd_parts:
/ fp_number_type *dbg._fpadd_parts(fp_number_type *a, fp_number_type *b, fp_number_type *tmp);
| ; arg fp_number_type *a @ a13
| ; arg fp_number_type *b @ a12
| ; arg fp_number_type *tmp @ a15
| ; var intfrac tfraction @ d3
| ; var int a_normal_exp @ d15
| ; var int b_normal_exp @ d2
| ; var fractype a_fraction @ d11
| ; var fractype b_fraction @ d9
| ; var int diff @ d12
| 0x80003c60 ld.bu d15, [a4]0 ; fp-bit.c:604 ; fp_number_type *_fpadd_parts(fp_number_type *a, fp_number_type *b, fp_number_type *tmp);
---------
var const char *sc @ a2
arg const char *s @ a4
arg size_t maxsize @ d4
void dbg.strnlen_s(const char *s);
;-- strnlen_s:
/ size_t dbg.strnlen_s(const char *s, size_t maxsize);
| ; arg size_t maxsize @ d4
| ; var const char *sc @ a2
| ; arg const char *s @ a4
| 0x800030ca mov d2, 0 ; strnlen_s.c:6 ; size_t strnlen_s(const char *s, size_t maxsize);
---------
arg mbstate_t *pst @ a12
var _Statab *pwcstate @ a13
arg char *s @ a15
arg wchar_t wc @ d15
void dbg._Wctomb();
;-- _Wctomb:
/ int dbg._Wctomb(char *s, wchar_t wc, mbstate_t *pst);
| ; arg char *s @ a15
| ; arg wchar_t wc @ d15
| ; arg mbstate_t *pst @ a12
| ; var _Statab *pwcstate @ a13
| 0x800018a6 movh.a a2, 53248 ; xwctomb.c:123 ; int _Wctomb(char *s, wchar_t wc, mbstate_t *pst);
---------
arg wchar_t *pwc @ a4
arg const char *s @ a5
arg mbstate_t *pst @ a6
arg size_t nin @ d4
void dbg._Mbtowc(wchar_t *pwc, const char *s, mbstate_t *pst);
;-- _Mbtowc:
/ int dbg._Mbtowc(wchar_t *pwc, const char *s, size_t nin, mbstate_t *pst);
| ; arg size_t nin @ d4
| ; arg wchar_t *pwc @ a4
| ; arg const char *s @ a5
| ; arg mbstate_t *pst @ a6
| 0x80003084 movh.a a15, 53248 ; xmbtowc.c:150 ; int _Mbtowc(wchar_t *pwc, const char *s, size_t nin, mbstate_t *pst);
---------
arg int except @ d4
int feraiseexcept(int excepts);
;-- feraiseexcept:
/ int dbg.feraiseexcept(int except);
| ; arg int except @ d4
| 0x800037d8 mov d2, 0 ; feraiseexcept.c:173 ; int feraiseexcept(int except);
---------
var Ppvoidfn newfuns @ a12
var size_t inc @ d15
void dbg._Atrealloc();
;-- _Atrealloc:
/ int dbg._Atrealloc();
| ; var size_t inc @ d15
| ; var Ppvoidfn newfuns @ a12
| 0x80001994 movh.a a15, 53248 ; exit.c:22 ; int _Atrealloc();
---------
EOF
RUN
NAME=Function arguments from DWARF (tricore-gcc)
FILE=bins/elf/float_ex1/float_ex1_tricore_gcc
CMDS=<<EOF
aaa
s sym.fn1
e asm.comments=0
pdf
EOF
EXPECT=<<EOF
/ sym.fn1();
| 0x800004ce mov.aa a14, sp
| 0x800004d0 sub.a sp, 24
| 0x800004d2 st.w [a14]-4, d4
| 0x800004d6 st.a [a14]-8, a4
| 0x800004da st.d [a14]-16, e6
| 0x800004de st.a [a14]-20, a5
| 0x800004e2 st.a [a14]-24, a6
| 0x800004e6 ld.w d15, [a14]-20
| 0x800004ea jz d15, 0x800004f2
| 0x800004ec ld.w d15, [a14]-24
| 0x800004f0 jnz d15, 0x800004f6
| 0x800004f2 mov d15, 0
| 0x800004f4 j 0x8000054c
| 0x800004f6 mov d4, 20
| 0x800004fa call dbg.malloc
| 0x800004fe mov.aa a15, a2
| 0x80000500 mov.d d15, a15
| 0x80000502 ld.a a15, [a14]-24
| 0x80000506 st.w [a15]0, d15
| 0x80000508 ld.a a15, [a14]-24
| 0x8000050c ld.a a15, [a15]0
| 0x8000050e ld.w d15, [a14]-4
| 0x80000512 st.w [a15]0, d15
| 0x80000514 ld.a a15, [a14]-24
| 0x80000518 nop
| 0x8000051a ld.w d15, [a15]0
| 0x8000051c mov.a a15, d15
| 0x8000051e add.a a15, 4
| 0x80000520 mov d4, 5
| 0x80000522 ld.a a5, [a14]-8
| 0x80000526 mov.aa a4, a15
| 0x80000528 call dbg.strncpy
| 0x8000052c ld.a a15, [a14]-24
| 0x80000530 ld.a a15, [a15]0
| 0x80000532 ld.d e4, [a14]-16
| 0x80000536 call dbg.__truncdfsf2
| 0x8000053a mov d15, d2
| 0x8000053c st.w [a15]12, d15
| 0x8000053e ld.a a15, [a14]-24
| 0x80000542 ld.a a15, [a15]0
| 0x80000544 ld.w d15, [a14]-20
| 0x80000548 st.w [a15]16, d15
| 0x8000054a mov d15, 1
| 0x8000054c mov d2, d15
| 0x8000054e ret
EOF
RUN
@ -958,7 +1137,7 @@ s dbg._Atrealloc
EOF
EXPECT=<<EOF
var va_list ap @ stack + 0x4
arg const char * fmt @ a6
arg const char *fmt @ a6
int printf(const char *format);
;-- printf:
/ int dbg.printf(const char *fmt, va_args ..);
@ -966,8 +1145,8 @@ int printf(const char *format);
| ; var va_list ap @ stack + 0x4
| 0x80000c22 mov.aa a6, a4 ; printf.c:10 ; int printf(const char *fmt, va_args ..);
arg void * str @ a15
arg const char * buf @ a5
arg void *str @ a15
arg const char *buf @ a5
arg size_t n @ d4
void dbg.prout(const char *buf);
;-- prout:
@ -977,22 +1156,22 @@ void dbg.prout(const char *buf);
| ; arg const char *buf @ a5
| 0x80000c04 mov.aa a15, a4 ; printf.c:5 ; void *prout(void *str, const char *buf, size_t n);
arg fp_number_type * b @ a12
arg fp_number_type * a @ a13
arg fp_number_type * tmp @ a15
arg fractype a_fraction @ d11
arg int diff @ d12
arg int a_normal_exp @ d15
arg int b_normal_exp @ d2
arg int sdiff @ d3
arg fractype b_fraction @ d9
arg fp_number_type *b @ a12
arg fp_number_type *a @ a13
arg fp_number_type *tmp @ a15
var fractype a_fraction @ d11
var int diff @ d12
var int a_normal_exp @ d15
var int b_normal_exp @ d2
var intfrac tfraction @ d3
var fractype b_fraction @ d9
void dbg._fpadd_parts();
;-- _fpadd_parts:
/ fp_number_type *dbg._fpadd_parts(fp_number_type *a, fp_number_type *b, fp_number_type *tmp);
| ; arg fp_number_type *a @ a13
| ; arg fp_number_type *b @ a12
| ; arg fp_number_type *tmp @ a15
| ; var int sdiff @ d3
| ; var intfrac tfraction @ d3
| ; var int a_normal_exp @ d15
| ; var int b_normal_exp @ d2
| ; var fractype a_fraction @ d11
@ -1000,8 +1179,8 @@ void dbg._fpadd_parts();
| ; var int diff @ d12
| 0x80003c60 ld.bu d15, [a4]0 ; fp-bit.c:604 ; fp_number_type *_fpadd_parts(fp_number_type *a, fp_number_type *b, fp_number_type *tmp);
arg const char * sc @ a2
arg const char * s @ a4
var const char *sc @ a2
arg const char *s @ a4
arg size_t maxsize @ d4
void dbg.strnlen_s(const char *s);
;-- strnlen_s:
@ -1011,9 +1190,9 @@ void dbg.strnlen_s(const char *s);
| ; arg const char *s @ a4
| 0x800030ca mov d2, 0 ; strnlen_s.c:6 ; size_t strnlen_s(const char *s, size_t maxsize);
arg mbstate_t * pst @ a12
arg _Statab * pwcstate @ a13
arg char * s @ a15
arg mbstate_t *pst @ a12
var _Statab *pwcstate @ a13
arg char *s @ a15
arg wchar_t wc @ d15
void dbg._Wctomb();
;-- _Wctomb:
@ -1024,9 +1203,9 @@ void dbg._Wctomb();
| ; var _Statab *pwcstate @ a13
| 0x800018a6 movh.a a2, 53248 ; xwctomb.c:123 ; int _Wctomb(char *s, wchar_t wc, mbstate_t *pst);
arg wchar_t * pwc @ a4
arg const char * s @ a5
arg mbstate_t * pst @ a6
arg wchar_t *pwc @ a4
arg const char *s @ a5
arg mbstate_t *pst @ a6
arg size_t nin @ d4
void dbg._Mbtowc(wchar_t *pwc, const char *s, mbstate_t *pst);
;-- _Mbtowc:
@ -1044,8 +1223,8 @@ int feraiseexcept(int excepts);
| ; arg int except @ d4
| 0x800037d8 mov d2, 0 ; feraiseexcept.c:173 ; int feraiseexcept(int except);
arg Ppvoidfn newfuns @ a12
arg size_t inc @ d15
var Ppvoidfn newfuns @ a12
var size_t inc @ d15
void dbg._Atrealloc();
;-- _Atrealloc:
/ int dbg._Atrealloc();

View file

@ -4307,8 +4307,8 @@ arg int64_t arg1 @ rdi
arg int64_t arg3 @ rdx
arg int64_t arg2 @ rsi
void fcn.00010270(int64_t arg1, int64_t arg2, const char **s, int64_t arg4, int64_t arg5);
var const char * s2 @ stack - 0xc8
var void * s1 @ stack - 0xc0
var const char *s2 @ stack - 0xc8
var void *s1 @ stack - 0xc0
var uint64_t var_b8h @ stack - 0xb8
var int64_t var_b0h @ stack - 0xb0
var int64_t var_a8h @ stack - 0xa8
@ -4316,13 +4316,13 @@ var uint64_t var_98h @ stack - 0x98
var int64_t var_94h @ stack - 0x94
var int64_t var_90h @ stack - 0x90
var int64_t var_88h @ stack - 0x88
var const char ** var_80h @ stack - 0x80
var const char **var_80h @ stack - 0x80
var int64_t var_78h @ stack - 0x78
var int64_t var_40h @ stack - 0x40
arg int64_t arg5 @ r8
arg int64_t arg4 @ rcx
arg int64_t arg1 @ rdi
arg const char ** s @ rdx
arg const char **s @ rdx
arg int64_t arg2 @ rsi
EOF
RUN

View file

@ -1478,7 +1478,7 @@ EXPECT=<<EOF
var uint64_t var_80h @ stack - 0x80
var uint64_t var_71h @ stack - 0x71
var int64_t var_70h @ stack - 0x70
var char * var_60h @ stack - 0x60
var char *var_60h @ stack - 0x60
var int64_t var_58h @ stack - 0x58
var int64_t var_56h @ stack - 0x56
var int64_t var_50h @ stack - 0x50
@ -1488,7 +1488,7 @@ var int64_t var_41h @ stack - 0x41
var int64_t var_40h @ stack - 0x40
arg int64_t arg_5h @ stack + 0x5
arg int argc @ rdi
arg char ** argv @ rsi
arg char **argv @ rsi
var uint64_t var_80h @ stack - 0x80
var uint64_t var_71h @ stack - 0x71
var char [20] var_70h @ stack - 0x70
@ -1501,7 +1501,7 @@ var int64_t var_41h @ stack - 0x41
var int64_t var_40h @ stack - 0x40
arg int64_t arg_5h @ stack + 0x5
arg int argc @ rdi
arg char ** argv @ rsi
arg char **argv @ rsi
var var_70h = 0x00000028 = [ 'h', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '@', '.', '8', '.', '.', '.', '@', '.' ]
EOF
RUN
@ -1516,8 +1516,8 @@ afv
EOF
EXPECT=<<EOF
var size_t size @ stack - 0x1c
var char * dest @ stack - 0x18
var const char * src @ stack - 0x10
var char *dest @ stack - 0x18
var const char *src @ stack - 0x10
EOF
RUN
@ -1531,8 +1531,8 @@ afv
EOF
EXPECT=<<EOF
var size_t size @ stack - 0x1c
var char * ptr @ stack - 0x18
var const char * src @ stack - 0x10
var char *ptr @ stack - 0x18
var const char *src @ stack - 0x10
EOF
RUN
@ -1546,9 +1546,9 @@ afv
EOF
EXPECT=<<EOF
var size_t var_24h @ stack - 0x24
var const char * var_20h @ stack - 0x20
var const char * s @ stack - 0x18
var const char * var_10h @ stack - 0x10
var const char *var_20h @ stack - 0x20
var const char *s @ stack - 0x18
var const char *var_10h @ stack - 0x10
EOF
RUN
@ -1563,9 +1563,9 @@ EOF
EXPECT=<<EOF
var size_t var_28h @ stack - 0x28
var size_t size @ stack - 0x24
var const char * src @ stack - 0x20
var const char * s2 @ stack - 0x18
var char * dest @ stack - 0x10
var const char *src @ stack - 0x20
var const char *s2 @ stack - 0x18
var char *dest @ stack - 0x10
EOF
RUN
@ -1578,13 +1578,13 @@ aaft
afv
EOF
EXPECT=<<EOF
var const char * src @ stack - 0x24
var const char * s2 @ stack - 0x20
var const char *src @ stack - 0x24
var const char *s2 @ stack - 0x20
var size_t var_1ch @ stack - 0x1c
var size_t size @ stack - 0x18
var char * dest @ stack - 0x14
var char *dest @ stack - 0x14
var int32_t var_10h @ stack - 0x10
arg char ** argv @ stack + 0x4
arg char **argv @ stack + 0x4
EOF
RUN
@ -1613,9 +1613,9 @@ afvr
EOF
EXPECT=<<EOF
arg size_t arg4 @ rcx
arg const char * arg1 @ rdi
arg const char *arg1 @ rdi
arg int64_t arg3 @ rdx
arg const char * arg2 @ rsi
arg const char *arg2 @ rsi
EOF
RUN
@ -1705,7 +1705,7 @@ s main
afv~ptr
EOF
EXPECT=<<EOF
var char ** ptr @ stack - 0x20
var char **ptr @ stack - 0x20
EOF
RUN
@ -1735,12 +1735,12 @@ s main
afv
EOF
EXPECT=<<EOF
var void * va_args @ stack - 0x3c
var void *va_args @ stack - 0x3c
var uint64_t var_34h @ stack - 0x34
var FILE * stream @ stack - 0x30
var const char * s @ stack - 0x28
var const char * var_20h @ stack - 0x20
var const char * var_18h @ stack - 0x18
var FILE *stream @ stack - 0x30
var const char *s @ stack - 0x28
var const char *var_20h @ stack - 0x20
var const char *var_18h @ stack - 0x18
var int64_t canary @ stack - 0x10
EOF
RUN
@ -1769,9 +1769,9 @@ s sym.processCmd
afv
EOF
EXPECT=<<EOF
var char ** var_14e8h @ stack - 0x14e8
var char **var_14e8h @ stack - 0x14e8
var int var_14dch @ stack - 0x14dc
var int * wstatus @ stack - 0x14d4
var int *wstatus @ stack - 0x14d4
var int64_t var_14cch @ stack - 0x14cc
var int64_t var_14c8h @ stack - 0x14c8
var int64_t var_14c4h @ stack - 0x14c4
@ -1779,20 +1779,20 @@ var uint64_t pid @ stack - 0x14c0
var uint64_t var_14bch @ stack - 0x14bc
var uint64_t var_14b8h @ stack - 0x14b8
var int64_t var_14b4h @ stack - 0x14b4
var const char * var_14b0h @ stack - 0x14b0
var const char * s @ stack - 0x14a8
var const char *var_14b0h @ stack - 0x14b0
var const char *s @ stack - 0x14a8
var int64_t var_14a0h @ stack - 0x14a0
var char * src @ stack - 0x1498
var const char * v2 @ stack - 0x1490
var const char * var_1488h @ stack - 0x1488
var void * var_1480h @ stack - 0x1480
var char * dest @ stack - 0x1478
var void * var_1428h @ stack - 0x1428
var const char * s1 @ stack - 0x1028
var char *src @ stack - 0x1498
var const char *v2 @ stack - 0x1490
var const char *var_1488h @ stack - 0x1488
var void *var_1480h @ stack - 0x1480
var char *dest @ stack - 0x1478
var void *var_1428h @ stack - 0x1428
var const char *s1 @ stack - 0x1028
var int64_t var_20h @ stack - 0x20
arg int argc @ rdi
arg char ** argv @ rsi
var char * str @ stack - 0xb8
arg char **argv @ rsi
var char *str @ stack - 0xb8
var int64_t var_ach @ stack - 0xac
var int64_t var_a8h @ stack - 0xa8
var uint64_t var_a4h @ stack - 0xa4
@ -1810,19 +1810,19 @@ var int var_78h @ stack - 0x78
var int var_74h @ stack - 0x74
var int64_t var_70h @ stack - 0x70
var int64_t var_6ch @ stack - 0x6c
var char * var_68h @ stack - 0x68
var char * var_60h @ stack - 0x60
var char * var_58h @ stack - 0x58
var char * var_50h @ stack - 0x50
var char *var_68h @ stack - 0x68
var char *var_60h @ stack - 0x60
var char *var_58h @ stack - 0x58
var char *var_50h @ stack - 0x50
var uint64_t var_48h @ stack - 0x48
var const char * s1 @ stack - 0x40
var const char * s @ stack - 0x38
var const char * var_30h @ stack - 0x30
var const char * var_28h @ stack - 0x28
var const char *s1 @ stack - 0x40
var const char *s @ stack - 0x38
var const char *var_30h @ stack - 0x30
var const char *var_28h @ stack - 0x28
var int64_t var_20h @ stack - 0x20
var int64_t var_10h @ stack - 0x10
arg int64_t arg1 @ rdi
arg char * arg2 @ rsi
arg char *arg2 @ rsi
EOF
RUN
@ -1836,27 +1836,27 @@ afv
EOF
EXPECT=<<EOF
var int32_t var_1454h @ stack - 0x1454
var void * var_1438h @ stack - 0x1438
var const char * s1 @ stack - 0x1038
var int * wstatus @ stack - 0x44
var void *var_1438h @ stack - 0x1438
var const char *s1 @ stack - 0x1038
var int *wstatus @ stack - 0x44
var int32_t var_40h @ stack - 0x40
var const char * var_3ch @ stack - 0x3c
var const char *var_3ch @ stack - 0x3c
var int32_t var_38h @ stack - 0x38
var int32_t var_34h @ stack - 0x34
var int32_t var_30h @ stack - 0x30
var pid_t pid @ stack - 0x2c
var const char * v2 @ stack - 0x28
var const char *v2 @ stack - 0x28
var int32_t var_24h @ stack - 0x24
var const char * src @ stack - 0x20
var const char *src @ stack - 0x20
var int32_t var_1ch @ stack - 0x1c
var int32_t var_18h @ stack - 0x18
var const char * s @ stack - 0x14
var const char * var_10h @ stack - 0x10
var const char *s @ stack - 0x14
var const char *var_10h @ stack - 0x10
var int32_t var_ch @ stack - 0xc
var int32_t var_8h @ stack - 0x8
var const char * option @ stack - 0x4
var const char *option @ stack - 0x4
arg int argc @ r0
arg char ** argv @ r1
arg char **argv @ r1
EOF
RUN
@ -1873,9 +1873,9 @@ var int64_t var_2dh @ stack - 0x2d
var int64_t var_2ch @ stack - 0x2c
var unsigned int var_28h @ stack - 0x28
var int64_t var_24h @ stack - 0x24
var const char * var_20h @ stack - 0x20
var const char *var_20h @ stack - 0x20
var long int var_18h @ stack - 0x18
var const char * var_10h @ stack - 0x10
var const char *var_10h @ stack - 0x10
EOF
RUN
@ -1888,14 +1888,14 @@ s main
afv
EOF
EXPECT=<<EOF
var char ** var_30h @ stack - 0x30
var char ** var_28h @ stack - 0x28
var char **var_30h @ stack - 0x30
var char **var_28h @ stack - 0x28
var int var_1ch @ stack - 0x1c
var void * var_18h @ stack - 0x18
var void *var_18h @ stack - 0x18
var int var_ch @ stack - 0xc
arg int argc @ rdi
arg char ** envp @ rdx
arg char ** argv @ rsi
arg char **envp @ rdx
arg char **argv @ rsi
EOF
RUN
@ -1929,7 +1929,7 @@ s main
afv~var_28h
EOF
EXPECT=<<EOF
var const char * var_28h @ stack - 0x28
var const char *var_28h @ stack - 0x28
EOF
RUN
@ -1941,7 +1941,7 @@ s sym.foo
afv~var_28h
EOF
EXPECT=<<EOF
var size_t * var_28h @ stack - 0x28
var size_t *var_28h @ stack - 0x28
EOF
RUN

View file

@ -54,8 +54,8 @@ var int64_t var_30h @ stack - 0x30
var int64_t var_28h @ stack - 0x28
var int64_t var_20h @ stack - 0x20
var int64_t var_18h @ stack - 0x18
arg int64_t error @ r12
arg int64_t self @ r13
var int64_t error @ r12
var int64_t self @ r13
EOF
RUN