[Issue 21669] New: closure over type with destructor allows accessing destroyed value if used after scope exits
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Feb 28 05:34:34 UTC 2021
https://issues.dlang.org/show_bug.cgi?id=21669
Issue ID: 21669
Summary: closure over type with destructor allows accessing
destroyed value if used after scope exits
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: schveiguy at gmail.com
An example:
import std.stdio;
struct S
{
int i;
~this() { i = -1;}
}
void main()
{
int delegate() dg;
{
S s;
dg = () { return s.i; };
writeln(dg()); // 0
}
writeln(dg()); // -1
}
Allowing access to a destroyed variable where a destructor has invalidated the
object should not be allowed. Prior to 2.053, this was an error. According to
Paul Backus, the responsible PR was this:
https://github.com/dlang/dmd/pull/5292
One who has created a delegate would probably expect that when calling the
delegate at a later time, the state of the object should be preserved, and not
destroyed. For some cases, it might be dangerous safety-wise to use an object
after destruction.
Fixing this issue probably requires a long deprecation period, as no doubt code
that depends on this (or works in spite of the dangers) exists today.
--
More information about the Digitalmars-d-bugs
mailing list