Likely closure memory corruption
Maxim Fomin
maxim at maxim-fomin.ru
Sun Mar 3 23:10:17 PST 2013
On Monday, 4 March 2013 at 02:10:12 UTC, deadalnix wrote:
> On Sunday, 3 March 2013 at 17:27:52 UTC, Maxim Fomin wrote:
>> On Sunday, 3 March 2013 at 16:48:32 UTC, deadalnix wrote:
>>> auto objectSource = new FileSource("../libs/object.d");
>>> auto object = lex!((line, index, length) {
>>> import std.stdio;
>>> writeln("new location 2 ! ", cast(void*) objectSource);
>>>
>>> return Location(objectSource, line, index, length);
>>> })(objectSource.content);
>>>
>>> Running this, I see that at some point, objectSource is
>>> changed. The output is
>>> new location 2 ! 7F494EEC1D40
>>> new location 2 ! 7F494EEC1D40
>>> ...
>>> new location 2 ! 7F494EEC1D40
>>> new location 2 ! 7F494EEC2EA0
>>>
>>> Obviously, the program segfault soon after that.
>>>
>>> It sounds like some memory corruption occurs under the hood.
>>> What can I do to work around that bug and to help solving it ?
>>
>> It is unlikely that the particular closure corrupts data since
>> at three times the address is correct. Closure bugs are
>> typically revealed as wrong function code, so there would no
>> difference between addresses. Something else in scope of
>> "objectSource" may corrupt it. You can try to pass explicitly
>> types of closure parameters, rewrite closure as a nested
>> function - it used to mitigate some closure bugs in the past.
>> Without compilable source I cannot say anything more.
>
> The problem here is that the codebase involved is rather huge.
> Do you have an advice to reduce the issue ?
No specific advice except for dropping everything except
FileSource definition and lex template. By the way, what is
objectSource.content? A tuple of line, index, length?
More information about the Digitalmars-d
mailing list