Skip to content

Commit 7d61edc

Browse files
committed
Heapless strings for the emulation stack ##esil
1 parent 0f2dd3c commit 7d61edc

File tree

10 files changed

+296
-556
lines changed

10 files changed

+296
-556
lines changed

libr/anal/esil_dfg.c

Lines changed: 20 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ static RGraphNode *_edf_mem_get(RAnalEsilDFG *dfg, ut64 addr, ut32 size) {
632632
return mem_node;
633633
}
634634

635-
static RGraphNode *_edf_const_get(RAnalEsilDFG *dfg, char *const_value) {
635+
static RGraphNode *_edf_const_get(RAnalEsilDFG *dfg, const char *const_value) {
636636
RGraphNode *orig_value_gnode = r_graph_add_node (dfg->flow, r_anal_esil_dfg_node_new (dfg, const_value));
637637
RAnalEsilDFGNode *value_node = r_anal_esil_dfg_node_new (dfg, const_value);
638638
value_node->type = R_ANAL_ESIL_DFG_TAG_CONST;
@@ -692,7 +692,7 @@ static void edf_sf_constraint(RStrBuf *result, const char *new_node_str) {
692692
}
693693

694694
static bool edf_sf(REsil *esil) {
695-
char *bitsize = r_esil_pop (esil);
695+
const char *bitsize = r_esil_pop (esil);
696696
R_LOG_INFO ("bitsize not yet implemented for sf (%s)", bitsize);
697697
return edf_use_new_push_1 (esil, "$s", edf_sf_constraint);
698698
}
@@ -726,19 +726,15 @@ static bool edf_bf(REsil *esil) {
726726
static bool _edf_consume_2_set_reg(REsil *esil, const bool use_origin) {
727727
const char *op_string = esil->current_opstr;
728728
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
729-
char *dst = r_esil_pop (esil);
730-
char *src = r_esil_pop (esil);
729+
const char *dst = r_esil_pop (esil);
730+
const char *src = r_esil_pop (esil);
731731

732732
if (!src || !dst) {
733-
free (dst);
734-
free (src);
735733
return false;
736734
}
737735

738736
int dst_type = r_esil_get_parm_type (esil, dst);
739737
if (dst_type == R_ESIL_PARM_INVALID) {
740-
free (dst);
741-
free (src);
742738
return false;
743739
}
744740

@@ -756,15 +752,12 @@ static bool _edf_consume_2_set_reg(REsil *esil, const bool use_origin) {
756752
RGraphNode *old_dst_node = dst_node;
757753

758754
if (!src_node || !dst_node) {
759-
free (src);
760-
free (dst);
761755
return false;
762756
}
763757

764758
RAnalEsilDFGNode *eop_node = r_anal_esil_dfg_node_new (edf, src);
765759
r_strbuf_appendf (eop_node->content, ",%s,%s", dst, op_string);
766760
eop_node->type = R_ANAL_ESIL_DFG_TAG_GENERATIVE;
767-
free (src);
768761

769762
RGraphNode *op_node = r_graph_add_node (edf->flow, eop_node);
770763
r_graph_add_edge (edf->flow, dst_node, op_node);
@@ -788,7 +781,6 @@ static bool _edf_consume_2_set_reg(REsil *esil, const bool use_origin) {
788781
r_graph_add_edge (edf->flow, op_node, dst_node);
789782
_edf_reg_set (edf, dst, dst_node);
790783
edf->cur = dst_node;
791-
free (dst);
792784
return true;
793785
}
794786

@@ -804,7 +796,7 @@ static bool edf_consume_2_set_reg(REsil *esil) {
804796
static bool edf_pop(REsil *esil) {
805797
const char *op_string = esil->current_opstr;
806798
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
807-
char *src = r_esil_pop (esil);
799+
const char *src = r_esil_pop (esil);
808800
if (!src) {
809801
return false;
810802
}
@@ -818,13 +810,11 @@ static bool edf_pop(REsil *esil) {
818810
src_node = _edf_var_get (edf, src);
819811
}
820812
if (!src_node) {
821-
free (src);
822813
return false;
823814
}
824815
RAnalEsilDFGNode *eop_node = r_anal_esil_dfg_node_new (edf, src);
825816
r_strbuf_appendf (eop_node->content, ",%s", op_string);
826817
eop_node->type = R_ANAL_ESIL_DFG_TAG_GENERATIVE;
827-
free (src);
828818
RGraphNode *op_node = r_graph_add_node (edf->flow, eop_node);
829819
r_graph_add_edge (edf->flow, src_node, op_node);
830820
return true;
@@ -833,7 +823,7 @@ static bool edf_pop(REsil *esil) {
833823
#if 1
834824
// TODO: kill DUP
835825
static bool edf_dup(REsil *esil) {
836-
char *src = r_esil_pop (esil);
826+
const char *src = r_esil_pop (esil);
837827
if (!src) {
838828
return false;
839829
}
@@ -880,11 +870,9 @@ static bool edf_dup(REsil *esil) {
880870
static bool edf_consume_2_push_1(REsil *esil) {
881871
const char *op_string = esil->current_opstr;
882872
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
883-
char *src[2] = { r_esil_pop (esil), r_esil_pop (esil) };
873+
const char *src[2] = { r_esil_pop (esil), r_esil_pop (esil) };
884874

885875
if (!src[0] || !src[1]) {
886-
free (src[0]);
887-
free (src[1]);
888876
return false;
889877
}
890878
RAnalEsilDFGNode *eop_node = r_anal_esil_dfg_node_new (edf, src[1]);
@@ -918,9 +906,6 @@ static bool edf_consume_2_push_1(REsil *esil) {
918906
r_graph_add_edge (edf->flow, src_node[i], op_node);
919907
}
920908

921-
free (src[0]);
922-
free (src[1]);
923-
924909
RAnalEsilDFGNode *result = r_anal_esil_dfg_node_new (edf, "result_");
925910
result->type = R_ANAL_ESIL_DFG_TAG_RESULT;
926911
if (const_result) {
@@ -937,7 +922,7 @@ static bool edf_consume_2_push_1(REsil *esil) {
937922
static bool edf_consume_1_push_1(REsil *esil) {
938923
const char *op_string = esil->current_opstr;
939924
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
940-
char *src = r_esil_pop (esil);
925+
const char *src = r_esil_pop (esil);
941926
if (!src) {
942927
return false;
943928
}
@@ -970,8 +955,6 @@ static bool edf_consume_1_push_1(REsil *esil) {
970955
const_result = (eop_type == R_ESIL_OP_TYPE_MATH) & !! (ec_node->type & R_ANAL_ESIL_DFG_TAG_CONST);
971956
}
972957

973-
free (src);
974-
975958
r_graph_add_edge (edf->flow, src_node, op_node);
976959

977960
RAnalEsilDFGNode *result = r_anal_esil_dfg_node_new (edf, "result_");
@@ -1015,7 +998,7 @@ static bool _edf_is_stack_or_mem_const_node(RAnalEsilDFG *dfg, RGraphNode *gnode
1015998
static bool edf_consume_1_get_mem_push_1(REsil *esil) {
1016999
const char *op_string = esil->current_opstr;
10171000
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
1018-
char *src = r_esil_pop (esil);
1001+
const char *src = r_esil_pop (esil);
10191002
if (!src) {
10201003
return false;
10211004
}
@@ -1065,20 +1048,17 @@ static bool edf_consume_1_get_mem_push_1(REsil *esil) {
10651048
// if (_edf_is_stack_or_mem_const_node (edf, src_node)) {
10661049
RStrBuf *expr = filter_gnode_expr (edf, src_node);
10671050
r_esil_parse (edf->esil, r_strbuf_get (expr));
1068-
char *src_addr_str = r_esil_pop (edf->esil);
1051+
const char *src_addr_str = r_esil_pop (edf->esil);
10691052
R_LOG_DEBUG ("resolved: %s => %s", r_strbuf_get (expr), src_addr_str);
10701053
r_strbuf_free (expr);
10711054
ut64 src_addr;
10721055
r_esil_get_parm (esil, src_addr_str, &src_addr);
1073-
free (src_addr_str);
10741056
r_esil_stack_free (edf->esil);
10751057
edf->iob.system (edf->iob.io, "reset");
10761058
mem_src_node = _edf_mem_get (edf, src_addr, mem_size);
10771059
}
10781060
}
10791061

1080-
free (src);
1081-
10821062
r_graph_add_edge (edf->flow, src_node, op_node);
10831063
if (mem_src_node) {
10841064
r_graph_add_edge (edf->flow, mem_src_node, op_node);
@@ -1101,12 +1081,10 @@ static bool edf_consume_1_get_mem_push_1(REsil *esil) {
11011081
static bool edf_consume_2_set_mem(REsil *esil) {
11021082
const char *op_string = esil->current_opstr;
11031083
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
1104-
char *dst = r_esil_pop (esil);
1105-
char *src = r_esil_pop (esil);
1084+
const char *dst = r_esil_pop (esil);
1085+
const char *src = r_esil_pop (esil);
11061086

11071087
if (!src || !dst) {
1108-
free (dst);
1109-
free (src);
11101088
return 0;
11111089
}
11121090

@@ -1167,11 +1145,10 @@ static bool edf_consume_2_set_mem(REsil *esil) {
11671145
if (((RAnalEsilDFGNode *)dst_node->data)->type & R_ANAL_ESIL_DFG_TAG_CONST) {
11681146
RStrBuf *expr = filter_gnode_expr (edf, dst_node);
11691147
r_esil_parse (edf->esil, r_strbuf_get (expr));
1170-
char *dst_addr_str = r_esil_pop (edf->esil);
1148+
const char *dst_addr_str = r_esil_pop (edf->esil);
11711149
R_LOG_DEBUG ("resolved: %s => %s", r_strbuf_get (expr), dst_addr_str);
11721150
r_strbuf_free (expr);
11731151
r_esil_get_parm (esil, dst_addr_str, &dst_addr);
1174-
free (dst_addr_str);
11751152
r_esil_stack_free (edf->esil);
11761153
edf->iob.system (edf->iob.io, "reset");
11771154
write_result = true;
@@ -1181,13 +1158,10 @@ static bool edf_consume_2_set_mem(REsil *esil) {
11811158
}
11821159

11831160
if (!src_node || !dst_node) {
1184-
free (src);
1185-
free (dst);
11861161
return false;
11871162
}
11881163

11891164
RAnalEsilDFGNode *eop_node = r_anal_esil_dfg_node_new (edf, src);
1190-
R_FREE (src);
11911165
r_strbuf_appendf (eop_node->content, ",%s,%s", dst, op_string);
11921166
eop_node->type = R_ANAL_ESIL_DFG_TAG_GENERATIVE;
11931167

@@ -1206,19 +1180,16 @@ static bool edf_consume_2_set_mem(REsil *esil) {
12061180
_edf_mem_set (edf, dst_addr, mem_size, dst_node);
12071181
}
12081182
r_graph_add_edge (edf->flow, op_node, dst_node);
1209-
free (dst);
12101183
return true;
12111184
}
12121185

12131186
static bool edf_consume_2_use_set_mem(REsil *esil) {
12141187
const char *op_string = esil->current_opstr;
12151188
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
1216-
char *dst = r_esil_pop (esil);
1217-
char *src = r_esil_pop (esil);
1189+
const char *dst = r_esil_pop (esil);
1190+
const char *src = r_esil_pop (esil);
12181191

12191192
if (!src || !dst) {
1220-
free (dst);
1221-
free (src);
12221193
return 0;
12231194
}
12241195

@@ -1279,11 +1250,10 @@ static bool edf_consume_2_use_set_mem(REsil *esil) {
12791250
if (((RAnalEsilDFGNode *)dst_node->data)->type & R_ANAL_ESIL_DFG_TAG_CONST) {
12801251
RStrBuf *expr = filter_gnode_expr (edf, dst_node);
12811252
r_esil_parse (edf->esil, r_strbuf_get (expr));
1282-
char *dst_addr_str = r_esil_pop (edf->esil);
1253+
const char *dst_addr_str = r_esil_pop (edf->esil);
12831254
R_LOG_DEBUG ("resolved: %s => %s", r_strbuf_get (expr), dst_addr_str);
12841255
r_strbuf_free (expr);
12851256
r_esil_get_parm (esil, dst_addr_str, &dst_addr);
1286-
free (dst_addr_str);
12871257
r_esil_stack_free (edf->esil);
12881258
edf->iob.system (edf->iob.io, "reset");
12891259
write_result = true;
@@ -1293,13 +1263,10 @@ static bool edf_consume_2_use_set_mem(REsil *esil) {
12931263
}
12941264

12951265
if (!src_node || !dst_node) {
1296-
free (src);
1297-
free (dst);
12981266
return false;
12991267
}
13001268

13011269
RAnalEsilDFGNode *eop_node = r_anal_esil_dfg_node_new (edf, src);
1302-
R_FREE (src);
13031270
r_strbuf_appendf (eop_node->content, ",%s,%s", dst, op_string);
13041271
eop_node->type = R_ANAL_ESIL_DFG_TAG_GENERATIVE;
13051272

@@ -1328,17 +1295,15 @@ static bool edf_consume_2_use_set_mem(REsil *esil) {
13281295
dst_node = r_graph_add_node (edf->flow, result);
13291296
}
13301297
r_graph_add_edge (edf->flow, op_node, dst_node);
1331-
free (dst);
13321298
return true;
13331299
}
13341300

13351301
static bool edf_consume_1_set_mem(REsil *esil) {
13361302
const char *op_string = esil->current_opstr;
13371303
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
1338-
char *dst = r_esil_pop (esil);
1304+
const char *dst = r_esil_pop (esil);
13391305

13401306
if (!dst) {
1341-
free (dst);
13421307
return 0;
13431308
}
13441309

@@ -1389,11 +1354,10 @@ static bool edf_consume_1_set_mem(REsil *esil) {
13891354
if (((RAnalEsilDFGNode *)dst_node->data)->type & R_ANAL_ESIL_DFG_TAG_CONST) {
13901355
RStrBuf *expr = filter_gnode_expr (edf, dst_node);
13911356
r_esil_parse (edf->esil, r_strbuf_get (expr));
1392-
char *dst_addr_str = r_esil_pop (edf->esil);
1357+
const char *dst_addr_str = r_esil_pop (edf->esil);
13931358
R_LOG_DEBUG ("resolved: %s => %s", r_strbuf_get (expr), dst_addr_str);
13941359
r_strbuf_free (expr);
13951360
r_esil_get_parm (esil, dst_addr_str, &dst_addr);
1396-
free (dst_addr_str);
13971361
r_esil_stack_free (edf->esil);
13981362
edf->iob.system (edf->iob.io, "reset");
13991363
write_result = true;
@@ -1403,7 +1367,6 @@ static bool edf_consume_1_set_mem(REsil *esil) {
14031367
}
14041368

14051369
if (!dst_node) {
1406-
free (dst);
14071370
return false;
14081371
}
14091372

@@ -1434,7 +1397,6 @@ static bool edf_consume_1_set_mem(REsil *esil) {
14341397
dst_node = r_graph_add_node (edf->flow, result);
14351398
}
14361399
r_graph_add_edge (edf->flow, op_node, dst_node);
1437-
free (dst);
14381400
return true;
14391401
}
14401402

@@ -1461,7 +1423,7 @@ static bool edf_use_new_push_1(REsil *esil, const char *op_string, AddConstraint
14611423

14621424
static bool edf_consume_1_use_old_new_push_1(REsil *esil, const char *op_string, AddConstraintStringConsume1UseOldNewCB cb) {
14631425
RAnalEsilDFG *edf = (RAnalEsilDFG *)esil->user;
1464-
char *src = r_esil_pop (esil);
1426+
const char *src = r_esil_pop (esil);
14651427

14661428
if (!src) {
14671429
return false;
@@ -1481,7 +1443,6 @@ static bool edf_consume_1_use_old_new_push_1(REsil *esil, const char *op_string,
14811443
} else {
14821444
src_node = _edf_var_get (edf, src);
14831445
}
1484-
free (src);
14851446

14861447
r_graph_add_edge (edf->flow, src_node, op_node);
14871448

@@ -2032,7 +1993,7 @@ R_API void r_anal_esil_dfg_fold_const(RAnal *anal, RAnalEsilDFG *dfg) {
20321993

20331994
// running filtered const-expression in esil
20341995
r_esil_parse (esil, r_strbuf_get (filtered));
2035-
char *reduced_const = r_esil_pop (esil);
1996+
const char *reduced_const = r_esil_pop (esil);
20361997
r_strbuf_free (filtered);
20371998

20381999
// this part needs some explanation:
@@ -2063,7 +2024,6 @@ R_API void r_anal_esil_dfg_fold_const(RAnal *anal, RAnalEsilDFG *dfg) {
20632024
gnode = (RGraphNode *)r_queue_dequeue (dfg->todo);
20642025
enode = (RAnalEsilDFGNode *)gnode->data;
20652026
r_strbuf_set (enode->content, reduced_const);
2066-
free (reduced_const);
20672027

20682028
while (!r_queue_is_empty (dfg->todo)) {
20692029
gnode = (RGraphNode *)r_queue_dequeue (dfg->todo);

libr/arch/p/avr/plugin.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* radare - LGPL - Copyright 2011-2025 - pancake, Roc Valles, condret, killabyte */
1+
/* radare - LGPL - Copyright 2011-2026 - pancake, Roc Valles, condret, killabyte */
22

33
#if 0
44
http://www.atmel.com/images/atmel-0856-avr-instruction-set-manual.pdf
@@ -237,12 +237,10 @@ static CPU_CONST *const_by_name(CPU_MODEL *cpu, int type, char *c) {
237237
}
238238

239239
static int __esil_pop_argument(REsil *esil, ut64 *v) {
240-
char *t = r_esil_pop (esil);
240+
const char *t = r_esil_pop (esil);
241241
if (!t || !r_esil_get_parm (esil, t, v)) {
242-
free (t);
243242
return false;
244243
}
245-
free (t);
246244
return true;
247245
}
248246

libr/arch/p/gb/plugin.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,12 +686,11 @@ static inline void gb_anal_cb_srl(RAnalOp *op, const ut8 data) {
686686

687687
static bool gb_custom_daa(REsil *esil) {
688688
R_RETURN_VAL_IF_FAIL (esil, false);
689-
char *v = r_esil_pop (esil);
689+
const char *v = r_esil_pop (esil);
690690
ut64 n;
691691
if (!v || !r_esil_get_parm (esil, v, &n)) {
692692
return false;
693693
}
694-
R_FREE (v);
695694
ut8 val = (ut8)n;
696695
if (R_UNLIKELY (!r_esil_reg_read (esil, "H", &n, NULL))) {
697696
return false;

0 commit comments

Comments
 (0)