From 99601456e6ad4c86287ba786923c99c5499037e0 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Tue, 6 Jan 2026 17:17:27 +0200 Subject: improve move checker to detect pointer leaks + Currently requires a lot of unnecessary `forget` statements, but at least some can likely be eliminated by doing some basic origin analysis, kind of like with groups --- examples/vec.fwd | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'examples/vec.fwd') diff --git a/examples/vec.fwd b/examples/vec.fwd index f7838f1..22049e0 100644 --- a/examples/vec.fwd +++ b/examples/vec.fwd @@ -45,9 +45,17 @@ set_vec(vec v, i64 i, i64 e, (vec) ok) { v => [n => n, s => s, buf => buf]; buf + (n - 1 as u64) => nbuf; - nil nbuf {fwdpanic("should never happen");} => dst; + nil nbuf { + nil nbuf; + fwdfree(buf); + fwdpanic("should never happen"); + } => dst; + + /* perform actual store */ e => dst*; - ok([n => n, s => s, nbuf => buf] vec); + + nil nbuf; + ok([n => n, s => s, buf => buf] vec); } n_vec(vec v, (vec, u64) ok) @@ -67,9 +75,19 @@ append_vec(vec v, i64 e, (vec) ok) at_vec(vec v, u64 i, (vec, &i64) ok) { v => [n => n, s => s, buf => buf]; - guard(i < n) => {fwdpanic("bounds error")} => ; - fwdptradd(buf, (i * sizeof(i64)) as i64) => *i64 buf; - nil buf {fwdpanic("should never happen");} => &i64 bufr; + guard(i < n) => { + fwdfree(buf); + fwdpanic("bounds error"); + } => ; + + buf + i => *i64 nbuf; + nil nbuf { + nil nbuf; + fwdfree(buf); + fwdpanic("should never happen"); + } => &i64 bufr; + + nil nbuf; ok([n => n, s => s, buf => buf] vec, bufr); } -- cgit v1.2.3