#5245 Memory leaks in compiled code

current: 8.6.0

This procedure leaks memory when run (or would if it didn't crash):

proc foo {} {while 1 {list a [list b [continue]]}}

The problem? The INST_CONTINUE doesn't clear things down. (This is a general problem if we've got a [return -code continue]; this is all work-in-progress.) So we add tracking of stack depth (dkf-compile-improvements branch) so we can issue the right number of INST_POPs and it hangs without memory consumption, absolutely correctly. Yay!

Let's try in our enhanced code with a new procedure:

proc foo {} {while 1 {puts {*}[puts {*}[continue]]}}

This is now worse; it leaks memory like it is going out of fashion! The problem is that we've got a build-up on the TD->auxObjList that can't be cleared.

I've not analyzed what happens when there's a [catch] involved.


  • Donal K. Fellows

    Note that returning from the stack frame (strictly, the bytecode execution context) releases the "leaking" memory so this is strictly not a leak. Just behaves like one.

    Tests for the various cases (both normal stack and expansion stack, both [break] and [continue]) discussed on the branch.

  • Donal K. Fellows

    Fixed on trunk; will not backport as new opcode was required.

    Case with [catch] still needs to be analyzed, but that can be its own bug report if necessary.

  • Donal K. Fellows

    • status: open --> closed-fixed

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:

No, thanks