[gecode-users] NaryUnion, infinite loop

Guido Tack tack at gecode.org
Fri Mar 30 10:13:07 CEST 2012


On 30 Mar 2012, at 18:48, Jean-Noël Monette wrote:

> Hi Guido,
> 
> You are totally right and this is indeed a bug in my (real) code, and I will change it accordingly. However, in the small example, I get the same problem when u0 is created using region1 instead of region2, i.e.
> 
> Region region1(home);
> Iter::Ranges::NaryUnion u0;
> {
>    Region region2(home);
>    u0 = Iter::Ranges::NaryUnion(region1,dom0); //region1 here
> }
> Iter::Ranges::NaryUnion u1(region1,u0,dom1);
> 
> 
> In this case, as far as I understand, there should be no dangling pointer, as u0 is initialized with memory from region1. Or do the two regions share their memory, and the destruction of region2 affects the memory of region1?

Right, that's a bug.  You currently can't use region1 while another "inner" region is active (i.e., in scope).  That's a bug and requires rewriting the region code, so it will have to wait until a future release.  Sorry about that.

Cheers,
Guido

> 
> Thank you for you answers, and sorry for the inconvenience.
> 
> Jean-Noël
> 
> On 03/30/2012 12:41 AM, Guido Tack wrote:
>> On 29/03/2012, at 7:56 PM, Jean-Noël Monette wrote:
>> 
>>> Hello,
>>> 
>>> Here is a new problem I came across with NaryUnion. As suggested by Christian, I created a fresh region for every new NaryUnion, however I ran into an infinite loop. Below is a minimal example. I located the infinite loop inside the "two(I&  i, J&  j)" method of NaryUnion, and the reason seems to be that, after the call to "RangeList* t = range(j)" in the "else if" block (I unfortunately cannot give you line numbers as I messed around with print statements), "i.c" and "t" point to the very same RangeList (while they should not). I'm not expert enough to go deeper/further...
>>> 
>>> Notice that this appears only when region2 is created in a block (in real code, it would be inside a "for" or a "if"), however there is no influence if it is actually used or not.
>>> 
>>> I guess it is again related to the Region implementation that is going to change, but I think it is worth mentioning it anyway.
>> Memory allocated from a region only lives as long as the region, and by passing u0 out of its region's scope, you get a dangling pointer.  It's like writing
>> 
>> char* c;
>> { string s = "hello"; c = s.c_str(); }
>> string s = "world";
>> printf("%s",c);
>> 
>> which will probably print world rather than hello.  So I'd say this is a bug in your code (and we should improve the documentation to make this clear).
>> 
>> Cheers,
>> Guido
>> 
>> 
> 
> _______________________________________________
> Gecode users mailing list
> users at gecode.org
> https://www.gecode.org/mailman/listinfo/gecode-users

-- 
Guido Tack,
http://www.csse.monash.edu/~guidot/



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gecode.org/pipermail/users/attachments/20120330/a2e47263/attachment-0001.htm>


More information about the users mailing list