D2.0: an example of use-case for casting invariant away

Regan Heath regan at netmail.co.nz
Thu Jun 21 05:08:33 PDT 2007


Walter Bright Wrote:
> Don Clugston wrote:
> > Walter Bright wrote:
> >> With D, you can cast away const-ness, that is legal. But if you 
> >> subsequently modify the underlying data, that is undefined behavior.
> > 
> > It sounds that in D, it will be too easy to cast away constness 
> > accidentally.
> > With C++, at least you can grep for const_cast and detect potentially 
> > dangerous code, and you get a strong visual clue.
> > Suppose I've written a D function like this:
> > 
> > void f(int *b, uint c)
> > {
> >   // maybe I'm avoiding a compiler warning or something.
> >   uint *d = cast(uint *)b;
> >   d += c;
> > }
> > 
> > Months later, I'm refactoring the code, and I convert the int * 
> > parameter to an invariant, without recognising that it's changing the 
> > value of b. Oops.
> > 
> > C++'s const would catch this mistake, but if I understand correctly, D 
> > will compile it without error. Suddenly the function has moved into the 
> > realm of undefined behaviour.
> > 
> > I hope I'm wrong. Or did I miss something?
> 
> No, you're not missing something. It is a general problem with cast - 
> cast is a blunt instrument which can easily hide problems.

So.. we're going to have to put up with this potential nasty bug?

What about a new cast which only removes 'const' and/or 'invariant and prohibit normal cast from removing it.

Perhaps calling it 'vary', eg.

void f(const int *b, uint c)
{
   int *d = vary() b;
}

Not sure about the (), if they're needed, or if vary(b) would be a better syntax.

The basic point being that cast cannot then cause the nasty bug and vary can be searched/grepped for.

Regan



More information about the Digitalmars-d mailing list