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