Disallow null references in safe code?
Adam D. Ruppe
destructionator at gmail.com
Sun Feb 2 05:46:39 PST 2014
On Sunday, 2 February 2014 at 13:18:19 UTC, Nick Treleaven wrote:
> I read your recent post about this, it was interesting. But I
> don't think you can disallow this:
>
> auto cn = checkNull(cast(C)null);
> NotNull!C nn = cn;
>
> obj2 is then null, when it shouldn't be allowed.
It wouldn't be null - it would be a runtime assertion failure
(except in release mode, when it would indeed be null). I think
that's OK.
Two reasons this is an improvement anyway:
1) The error message of "cannot implicitly convert cn of type C
to nn of type NotNull!C" made you realize there's a potential
problem here and attempt a fix.
That's why checkNull is there in the first place - it made you
consider the problem. Your fix isn't really right, but at least
now it should be obvious why.
2) The assertion failure happens right there at the assignment
point (the assert is in NotNull's constructor) instead of at the
use point. So when it fails at runtime, you don't have to work
backwards to figure out where null was introduced, it points you
straight at it and it won't be too hard to see that cn wasn't
properly checked.
Maybe not perfect, but I really think it is good enough and an
improvement.... if people actually use NotNull!T in their
functions and structures in the first place.
More information about the Digitalmars-d
mailing list