On Wednesday, 28 November 2012 at 22:13:05 UTC, Dan wrote:
On Wednesday, 28 November 2012 at 20:30:41 UTC, Maxim Fomin wrote:
On Wednesday, 28 November 2012 at 18:08:59 UTC, Dan wrote:

This code with version=bug produces garbage because of opAssign. It seems that opAssign is actually called before accessing map:


Maxim, thanks for looking more at this. This bug is not affecting my work in any way - I'm just trying to learn more about D and how to debug, and your responses are helpful.

I've now built druntime and phobos with debug to see if I can see what is going on more.

For me the relevant assembly of your code looks like below. I see the value in the assoc array get created and memset initialized to 0 inside aaA.d function _aaGetX with this line:

memset(ptail + aligntsize(keytitsize), 0, valuesize); // zero value

Then between +62 and +102 it goes off the rails and upon entry to opAssign *this* is likely garbage. I can't be certain because the values I see are 0, which would be consistent with 0 initialization - but could also just be luck. At this point I wish I knew some assembly. Anyway, I don't know if it is a problem with associative array code, per se, or the code generated by the compiler when opAssign and/or postblit are defined for the value type. I do know that if you have no postblit and no opAssign there are no issues - even with a destructor. This is consistent with the examples you have shown, they have postblit and/or opAssign as well as the RefCount code which has postblit and dtor. In both your example crash and the RefCount crash the actual seg fault is in the dtor accessing bogus data because as you pointed out it was not correctly initialized.

Thanks
Dan

 <skipped>

This doesn't look like assembly for previous source. Please provide the source for which you have assembly and tell which dmd options do you use.

Reply via email to