Re: [Gc] Strange leak in simple code

Bruce Hoult <[email protected]> Wed, 15 Jul 2015 16:15:29 +1200
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Message-ID <CAMU+EkzuAmjykjPwdOt1QW=Fhqgn1US=3Cz7XXniVnuf3Lf+FA@mail.gmail.com>
You can get lucky.

However filling all of memory with a single very long linked list (which it
is, until the first items are reclaimed) remains a very dangerous thing to
do with any conservative garbage collector.

Real programs tend to create many lists, and if from time to time one of
them is accidentally retained by a false pointer then you probably won't
even notice (unless you're expecting a finalizer to be run, which is
*never* guaranteed)

On Wed, Jul 15, 2015 at 4:06 PM, Юрий Соколов <[email protected]>
wrote:

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