https://issues.dlang.org/show_bug.cgi?id=20551
Issue ID: 20551
Summary: In @safe code and using delegates, it's possible to
escape references to function frame
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Keywords: safe
Severity: normal
Priority: P1
Component: dmd
Assignee: [email protected]
Reporter: [email protected]
test case, compiled with dmd 2.090.0, -preview=dip25 -preview=dip1000:
---
module runnable;
import std.stdio;
struct LazyStore(T)
{
T delegate() @safe dg;
void opAssign(E)(lazy E e) @safe
{
dg = cast(typeof(dg)) &e;
}
T test() @safe{ return dg(); }
}
static LazyStore!int f;
void main(string[] args) @safe
{
int x = 1;
f = x + x + 20 + x * 20;
writeln(f.test());
}
static void corrupt()
{
writeln(f.test());
}
static ~this()
{
corrupt();
}
---
LazyStore keeps a reference to the local variable passed as lazy expression in
its opAssign.
When using it out of the main() frame the result is undefined.
Suggested fix is to disallow taking address of a lazy parameter but only in
@safe code,
since otherwise this trick plesantly works.
--