@@ -4919,9 +4919,9 @@ static ut64 delta_for_access(RAnalOp *op, RAnalVarAccessType type) {
4919
4919
RAnalValue * src0 = r_vector_at (& op -> srcs , 0 );
4920
4920
RAnalValue * src1 = r_vector_at (& op -> srcs , 1 );
4921
4921
if (type == R_ANAL_VAR_ACCESS_TYPE_WRITE ) {
4922
- if ( dst ) {
4923
- return dst -> imm + dst -> delta ;
4924
- }
4922
+ // XXX fix invalid var analysis when using esil
4923
+ return 0 ;
4924
+ // if (dst) { return dst->imm + dst->delta; }
4925
4925
} else {
4926
4926
if (src1 && (src1 -> imm || src1 -> delta )) {
4927
4927
return src1 -> imm + src1 -> delta ;
@@ -4941,17 +4941,20 @@ static void handle_var_stack_access(REsil *esil, ut64 addr, RAnalVarAccessType t
4941
4941
const char * regname = reg_name_for_access (ctx -> op , type );
4942
4942
if (ctx -> fcn && regname ) {
4943
4943
ut64 spaddr = r_reg_getv (esil -> anal -> reg , ctx -> spname );
4944
+ // XXX the delte computed here is incorrect because in esil that state can be inconsistent with the function boundaries
4945
+ // XXX and that causes some var names to be incorrectly identified
4944
4946
if (addr >= spaddr && addr < ctx -> initial_sp ) {
4945
4947
int stack_off = addr - ctx -> initial_sp ;
4946
4948
// int stack_off = ctx->initial_sp - addr; // R2STACK
4947
4949
// eprintf (" (%llx) %llx = %d\n", ctx->initial_sp, addr, stack_off);
4948
4950
RAnalVar * var = r_anal_function_get_var (ctx -> fcn , R_ANAL_VAR_KIND_SPV , stack_off );
4949
- if (!var ) {
4950
- var = r_anal_function_get_var (ctx -> fcn , R_ANAL_VAR_KIND_BPV , stack_off );
4951
+ if (var ) {
4952
+ R_LOG_DEBUG ("Do not reanalyze an already defined variable" );
4953
+ return ;
4951
4954
}
4955
+ var = r_anal_function_get_var (ctx -> fcn , R_ANAL_VAR_KIND_BPV , stack_off );
4952
4956
if (!var && stack_off >= - ctx -> fcn -> maxstack ) {
4953
- char * varname ;
4954
- varname = ctx -> fcn -> anal -> opt .varname_stack
4957
+ char * varname = ctx -> fcn -> anal -> opt .varname_stack
4955
4958
? r_str_newf (VARPREFIX "_%xh" , R_ABS (stack_off ))
4956
4959
: r_anal_function_autoname_var (ctx -> fcn , R_ANAL_VAR_KIND_SPV , VARPREFIX , delta_for_access (ctx -> op , type ));
4957
4960
var = r_anal_function_set_var (ctx -> fcn , stack_off , R_ANAL_VAR_KIND_SPV , NULL , len , false, varname );
@@ -4975,6 +4978,7 @@ static bool is_stack(RIO *io, ut64 addr) {
4975
4978
}
4976
4979
4977
4980
static bool esilbreak_mem_write (REsil * esil , ut64 addr , const ut8 * buf , int len ) {
4981
+ // XXX causes invalid var names
4978
4982
handle_var_stack_access (esil , addr , R_ANAL_VAR_ACCESS_TYPE_WRITE , len );
4979
4983
// ignore writes in stack
4980
4984
if (myvalid (mycore -> io , addr ) && r_io_read_at (mycore -> io , addr , (ut8 * )buf , len )) {
@@ -5377,7 +5381,7 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
5377
5381
return ;
5378
5382
}
5379
5383
iend = end - start ;
5380
- if (iend < 0 ) {
5384
+ if (iend < 1 ) {
5381
5385
return ;
5382
5386
}
5383
5387
if (iend > MAX_SCAN_SIZE ) {
@@ -5683,6 +5687,9 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
5683
5687
}
5684
5688
}
5685
5689
break ;
5690
+ case R_ANAL_OP_TYPE_STORE :
5691
+ // TODO: the same as we do for load imho
5692
+ break ;
5686
5693
case R_ANAL_OP_TYPE_LOAD :
5687
5694
{
5688
5695
ut64 dst = esilbreak_last_read ;
0 commit comments