From deab9a5e7917f9fecbf36cf97ca9cac7910df990 Mon Sep 17 00:00:00 2001 From: WormHeamer Date: Sat, 9 Aug 2025 05:58:28 -0400 Subject: add N_DEAD node type, and assert to help prevent use-after-free --- ir.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) (limited to 'ir.c') diff --git a/ir.c b/ir.c index c935a67..42691ee 100644 --- a/ir.c +++ b/ir.c @@ -99,29 +99,18 @@ int type_check(Node *n) { /* nodes */ const char *node_type_name(NodeType t) { - const char *names[] = { - "N/A", - "start", "if-else", "region", "phi", "stop", - "projection", - "return", - "keepalive", - "literal", - "add", "sub", "mul", "div", - "and", "or", "xor", - "lshift", "rshift", - "neg", "not", - "equal", - "not-equal", - "less", - "greater", - "less-or-equal", - "greater-or-equal", + static const char *names[] = { +#define X(n, s) s, + NODE_TYPE_LIST +#undef X }; return names[t]; } void node_die(Node *n, Proc *p) { assert(n->refs == 0); + assert(n->op != N_DEAD); + n->op = N_DEAD; n->prev_free = p->free_list; p->free_list = n; } @@ -182,6 +171,8 @@ void node_set_in(Proc *p, Node *n, int idx, Node *to) { } void node_add(Proc *p, Node *src, Node *dest) { + if (src) assert(src->op != N_DEAD); + if (dest) assert(dest->op != N_DEAD); node_add_in(p, dest, src); if (!src) return; node_add_out(p, src, dest); @@ -194,9 +185,11 @@ void node_add(Proc *p, Node *src, Node *dest) { } void node_remove(Proc *p, Node *src, Node *dest) { + assert(dest->op != N_DEAD); node_del_in(dest, src); if (dest->refs < 1) node_die(dest, p); if (src) { + assert(src->op != N_DEAD); node_del_out(src, dest); if (src->out.len < 1) node_kill(src, p); } @@ -208,6 +201,7 @@ Node *node_new_empty(Proc *p, NodeType t) { Node *n; if (p->free_list) { n = p->free_list; + assert(n->op == N_DEAD); p->free_list = n->prev_free; memset(n, 0, sizeof(Node)); } else { -- cgit v1.2.3