Re: [Gc] Strange leak in simple code

Юрий Соколов <[email protected]> Wed, 15 Jul 2015 07:06:41 +0300
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Message-ID <CAL-rCA1qLnsJFvTVhO6+V3vyzogxSZymfk8BMN=NXn64GS9Hvg@mail.gmail.com>
Bruce,

This code fails with libgc packaged with Debian and Ubuntu. It works with
libgc compilled from source though.

For "If *any* other value in memory looks like a pointer to one of your
nodes" - i found that setting HEAP_START as high as 0x6000_00000000 and
enabling unmap helps a lot on Linux x86_64.

With regards,
Yura

2015-07-15 7:00 GMT+03:00 Bruce Hoult <[email protected]>:

> Ok, artificially tricky code, not what it first appears.
>
> However, it is still true that you are linking all the nodes together,
> just that you are not *explicitly* retaining a pointer to the first node.
>
> All that is required for this to not be garbage collected is, for example:
>
> 1) the compiler to keep a copy of the pointer to the first node allocated
> in a register or on the stack. Probably should not happen at -O0.
>
> 2) If *any* other value in memory looks like a pointer to one of your
> nodes (not just the first one), then all nodes allocated after that one
> will be retained.
>
>
> On Wed, Jul 15, 2015 at 2:52 PM, Юрий Соколов <[email protected]>
> wrote:
>
>> Read the code carefully.  This code keeps pointer only to last node. So
>> only two nodes are reachable at max.
>> What do you mean "it leaks?"
>>
>> You're making a linked list, with every object pointed to either by
>> 'last' or by the previous object.
>>
>> I would be very very unhappy if this was garbage collected!!
>>
>>
>> On Mon, Jul 13, 2015 at 11:12 PM, Юрий Соколов <[email protected]>
>> wrote:
>>
>>> Using libgc from Ubuntu 15.04 (7.2b-6.4) this simple code leaks:
>>>
>>>     #include <gc.h>
>>>     struct list {
>>>         struct list* next;    };
>>>         int main() {
>>>         GC_INIT();
>>>         struct list *last = NULL;
>>>         for (;;) {
>>>             struct list* nuo = GC_MALLOC(sizeof(struct list));
>>>             nuo->next = NULL;
>>>             // if next line is commented, then no leakage
>>>             if (last) last->next = nuo;
>>>             last = nuo;
>>>         }    }
>>>
>>>
>>>
>>> stackoverflow question
>>> http://stackoverflow.com/questions/31380641/libgc-why-this-code-leaks
>>>
>>> --
>>> This message has been scanned for viruses and
>>> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and
>>> is
>>> believed to be clean.
>>> _______________________________________________
>>> bdwgc mailing list
>>> [email protected]
>>> https://lists.opendylan.org/mailman/listinfo/bdwgc
>>>
>>
>>
>> --
>> This message has been scanned for viruses and
>> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and
>> is
>> believed to be clean.
>>
>
>

_______________________________________________
bdwgc mailing list
[email protected]
https://lists.opendylan.org/mailman/listinfo/bdwgc