[Issue 15399] New: unaligned pointers are not @safe

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Wed Dec 2 16:21:32 PST 2015


https://issues.dlang.org/show_bug.cgi?id=15399

          Issue ID: 15399
           Summary: unaligned pointers are not @safe
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: accepts-invalid, safe
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: thecybershadow at gmail.com

This @safe program produces dangling GC pointers by storing the only references
to them in an unaligned struct field:

//////////////////////////////// test.d ////////////////////////////////
@safe:

struct Victim
{
    bool alive = true;
    ~this() { alive = false; }
}

align(1)
struct Unaligned
{
align(1):
    ubyte filler;
    Victim* p;
}

pragma(msg, Unaligned.sizeof);

void main()
{
    enum N = 100;

    Unaligned[N] hosts;

    foreach (n; 0..N)
    {
        hosts[n].p = new Victim;
        assert(hosts[n].p.alive);
    }

    // Unaligned.p is invisible to the GC due to alignment

    void trustedCollect() @trusted { import core.memory; GC.collect(); }
    trustedCollect();

    foreach (n; 0..N)
        assert(hosts[n].p.alive); // Dangling pointer!
}
////////////////////////////////////////////////////////////////////////

--


More information about the Digitalmars-d-bugs mailing list