[Issue 9438] New: Strange RefCounted stack overflow
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Feb 1 07:26:13 PST 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9438
Summary: Strange RefCounted stack overflow
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: major
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: monarchdodra at gmail.com
--- Comment #0 from monarchdodra at gmail.com 2013-02-01 07:26:12 PST ---
I've been chasing this on and off for a couple months now. Basically, trying to
access the RefCounted.refCountedStore.isInitialized of a non-initialized
RefCounted in a field of a temporary will create a stack overflow. I know
that's not clear, but here is the reduced usecase:
//----
import std.container, std.stdio, std.typecons, std.exception;
struct S
{
RefCounted!int _data;
this(int)
{_data.refCountedStore.ensureInitialized();}
int get() @property
{
writeln("here");
enforce(_data.refCountedStore.isInitialized); //OH NOES!!!
writeln("there");
return _data.refCountedPayload;
}
}
void main()
{
// 1)
writeln(S(1).get);
// 2)
S s;
writeln(s.get).collectException();
// 3)
writeln(S().get);
}
//----
1) This will create a temporary S, and intialize the ref counted. the writeln
works.
2) The creates a non-temporary S. Trying to access the ref counted will
(correctly) throw an exception.
3) This will stack overflow at the "//OH NOES!!!" line: It will first call:
ref inout(RefCountedStore) refCountedStore() inout
To get the store, and then will recursively call "isInitialized" until the
program stack overflows. I have no idea why:
//----
@property nothrow @safe
bool isInitialized() const
{
return _store !is null;
}
//----
This seems to me like the tip of a more serious bug somewhere. I would be very
pleased if someone with more knowledge than me could try to look into it?
I think it might also create problems with things such as arrays of arrays:
Every time I've tried to fix http://d.puremagic.com/issues/show_bug.cgi?id=6153
I've had crashes (NOT asserts/enforeces), and I think this might be the reason.
Originally found with this code:
//----
void main()
{
writeln(Array!int()[0]);
}
//----
Yes, the code is wrong, but it should *assert*. Currently, it just dies.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list