[Issue 11510] New: Relax restriction for overlapped pointer field access in safe code/during CTFE

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Nov 13 07:10:33 PST 2013


https://d.puremagic.com/issues/show_bug.cgi?id=11510

           Summary: Relax restriction for overlapped pointer field access
                    in safe code/during CTFE
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: CTFE, spec
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: k.hara.pg at gmail.com


--- Comment #0 from Kenji Hara <k.hara.pg at gmail.com> 2013-11-13 07:10:31 PST ---
Currently in @safe code, declaring struct variable which contains any
overlapped pointer(==reference) fields is entirely disallowed.

struct S {
    union {
        size_t x;
        int* y; // pointer field
    }
    int[] arr;
}

// This is necessary to avoid related compiler bug
S _dummy = S();

void test() @safe {
    S s;
    // Error: variable s unions containing pointers are not allowed
    // in @safe functions
}

However I think this is too limited behavior. Even if S.y is an overlapped
pointer field,

1. Declaring a variable typed S
2. Both reading and writing unoverlapped field S.arr
3. Both reading and writing overlapped field S.x
4. Writing overlapped pointer field S.y

should be allowed.

Especially, by combining #3 and #4, you can reinterpret int* to size_t under
the @safe code. But it is nothing wrong, as same as
declaring size_t variable with void initializer.

void test() @safe {
    size_t num = void;
}

Even the value of 'num' is garbage, using it won't cause any memory corruption
in @safe. So currently it is properly accepted by compiler.

---

And the semantics should also work during CTFE. For CTFE, one following
restriction is necessary.

- Any field value reinterpretation by using two overlapped fields is
disallowed.
If it's detected in CTFE, should raise compile-time error.

Therefore, following code should work as expected.

bool test() {
    S s;    // declaration is OK

    s.y = [1,2,3].ptr;            // writing overlapped pointer field is OK
    assert(s.y[0..3] == [1,2,3]); // reading valid field is OK

    s.x = 10;
    assert(s.x == 10);

    // There's no reinterpretation between S.x and S.y
    return true;
}
static assert(test());  // run CTFE

-- 
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list