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