[Issue 19316] New: GC runtime breaks @safe
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Oct 19 19:52:47 UTC 2018
https://issues.dlang.org/show_bug.cgi?id=19316
Issue ID: 19316
Summary: GC runtime breaks @safe
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: major
Priority: P1
Component: druntime
Assignee: nobody at puremagic.com
Reporter: stanislav.blinov at gmail.com
Per @safe-ty rules, @safe functions shall not call @system functions.
Unfortunately, the GC may run finalizers during collection, even when that
collection is triggered from within @safe function:
import std.stdio;
class C {
~this() // @system!
{
printf("Called @system function\n");
}
}
void safeFunc() @safe {
auto a = new int[10^^6]; // 'new' may require collection
// do 'safe' things with 'a'
}
void main() {
new C; // the object is no longer referenced, will be collected, i.e.
assume that this happened elsewhere in the program via last reference going out
of scope
printf("Entering @safe function\n");
safeFunc(); // if this triggers collection, it effectively calls @system
C.__dtor inside @safe safeFunc
printf("Exited @safe function\n");
}
Output with default GC options:
Entering @safe function
Called @system function
Exited @safe function
Thus, arbitrary non- at safe code may 'escape' into @safe context. This of course
applies to struct destructors as well.
This issue is made worse by the fact that the behavior is non-deterministic:
collection may or may not trigger depending on the GC state, destructor may or
may not be called depending on program state.
--
More information about the Digitalmars-d-bugs
mailing list