Question about garbage collection specification
Steven Schveighoffer via Digitalmars-d
digitalmars-d at puremagic.com
Mon Jun 15 09:16:28 PDT 2015
On 6/15/15 11:49 AM, Alex Parrill wrote:
> On Monday, 15 June 2015 at 15:33:41 UTC, rsw0x wrote:
>>
>> this doesn't make any sense, it's referring to an object p (of void*),
>> not the location of p. It's setting the lsb of p to 1 and claiming
>> it's undefined behavior, when it's clearly not.
>>
>> Unless I misunderstand it.
>
> `p` is assumed to be a pointer. `cast(int) p` gets the integer
> representation of the pointer (though it should be `uintptr_t` but
> whatever). It then does an integer bitwise or, then converts the result
> back to a pointer.
>
> It's undefined behavior in D because the spec just said so (regardless
> of its defined behavior in C).
Where? In the GC document? I don't think that document is correct in
this regard. Undefined behavior is something different than
implementation defined behavior, which is what this is. The spec says
(http://dlang.org/type.html):
"Casting pointers to non-pointers and vice versa is allowed in D,
however, do not do this for any pointers that point to data allocated by
the garbage collector."
How can the compiler POSSIBLY know whether a pointer points at GC data
in order to make it undefined behavior?
I don't see any justification for any of these restrictions. The "to
allow maximum flexibility" justification needs more explanation, what
possible feature could you implement given this restriction?
It even allows using unions to do exactly the same thing. There is just
no way this cannot be allowed.
-Steve
More information about the Digitalmars-d
mailing list