Learn how easy it is to sync an existing GitHub or Google Code repo to a SourceForge project! See Demo


#5245 Memory leaks in compiled code

current: 8.6.0
Donal K. Fellows

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.


  • 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.

  • 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.

    • status: open --> closed-fixed