Access Violation in @safe Code
Steven Schveighoffer via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jan 29 21:18:08 PST 2016
On 1/29/16 11:53 PM, Matt Elkins wrote:
> Title says it; I get an access violation in code marked @safe. Here's a
> minimal example:
>
> [code]
> @safe:
>
> struct Foo(alias Callback)
> {
> ~this() {Callback();}
> }
>
> unittest
> {
> uint stackVar;
> alias FooType = Foo!((){++stackVar;});
>
> FooType[1] foos;
> foos[0] = FooType.init;
> }
> [/code]
>
> This results in:
> object.Error@(0): Access Violation
> ----------------
> 0x00405E2A in pure nothrow @nogc @safe void
> test.__unittestL9_4().__lambda1() at <path>\test.d(12)
> .... more stack ...
>
> Line 12 is the alias FooType line, where the delegate is defined.
>
> Where is this coming from? Intuition says it is something to do with
> calling the delegate after the stack frame has popped and stackVar is
> unreachable, but I'm not seeing it. Wouldn't foos be destructed before
> the stack frame is gone?
>
> I don't get the issue if I mark stackVar static, or if I don't perform
> the assignment to foos[0].
This looks like a bug in the compiler. It appears that Foo.init as an
rvalue destroying itself results in a call into an invalid stack.
It doesn't require a lambda, or a fixed-size array. And it doesn't
require the stack frame holding stackVar to be invalid. This also shows
the behavior:
unittest
{
uint stackVar;
void blah() { ++stackVar; }
{
// introduce inner scope
FooType foo = FooType.init;
}
}
https://issues.dlang.org/enter_bug.cgi
-Steve
More information about the Digitalmars-d-learn
mailing list