On 07/12/2016 01:15 AM, Shachar Shemesh wrote:
On 08/07/16 22:26, Andrei Alexandrescu wrote:

I agree with that. What would be a good example? Where is the reference
to Walter's promotion of UB in @safe code?


Andrei

I don't have an example by Walter, but I can give you an example by Andrei.

In D-Conf.

On Stage.

During the keynotes.

Immediately after knocking down C++ for doing the precise same thing,
but in a that is both defined and less likely to produce errors.

Love the drama. I was quite excited to see what follows :o).

The topic was reference counting's interaction with immutable (see
deadalnix's comment, to which I completely agree, about inter-features
interactions).

Amaury failed to produce an example to support his point, aside from a rehash of a bug report from 2013 that is virtually fixed. Do you have any?

When asked (by me) how you intend to actually solve this,
you said that since you know where the memory comes from, you will cast
away the immutability.

Casting away immutability is UB in D.

I understand. There is an essential detail that sadly puts an anticlimactic end to the telenovela. The unsafe cast happens at allocator level. Inside any memory allocator, there is a point at which behavior outside the type system happens: memory that is untyped becomes typed, and vice versa (during deallocation). As long as you ultimately use system primitives from getting untyped bytes, at some point you'll operate outside the type system. It stands to reason, then, that at allocator level information and manipulations outside the type system's capabilities are possible and level so long as such manipulations are part of the standard library and offer defined behavior. This is par for the course in C++ and any systems language.

The solution (very ingenious, due to dicebot) in fact does not quite cast immutability away. Starting from a possibly immutable pointer, it subtracts an offset from it. At that point the memory is not tracked by the type system, but known to the allocator to contain metadata associated with the pointer that had been allocated with it. After the subtraction, the cast exposes the data which is mutable without violating the immutability of the object proper. As I said, it's quite an ingenious solution.

Not long before that, you laughed at C++ for it's "mutable" keyword,
which allows doing this very thing in a way that is:
A. Fully defined (if you know what you're doing)
and
B. Not requiring a cast

I think we're in good shape with what we have; mutable has too much freedom and it's good to get away without it.



Andrei

Reply via email to