On Friday, 22 May 2020 at 01:22:19 UTC, Walter Bright wrote:
I have made these points before, but I'll summarize them here
for convenient referral.
<big snip> of material indicating, among other things, that even
really good programmers can screw up when it comes to language
design now and then. Ahem.
Continuing...
How does this relate to safe by default?
Consider the common (because that's how D started out) case of:
----- clibrary.d --------
T massage_data(... many parameters ...);
... 200 more such declarations ...
----- app.d ----------
import clibrary;
void useClibrary( ... parameters ...) {
massage_data(parameters);
}
---------------------
This code, today, does not use annotations and it works. It's
been working
for a long time. Now, we implement the amendment, and it stops
compiling
because useClibrary is @safe and massage_data is @system. The
user is faced
with the following alternatives:
1. Go through 200 functions in clibrary.d and determine which
are @safe
and which are @system. This is what we want them to do. We try
to motivate
this with compiler error messages. Unfortunately, this is both
tedious and
thoroughly impractical, as our poor user Will Not Know which
are safe and
which are system. We can correctly annotate core.stdc.stdio
because I know
those functions intimately. This is not true for other system C
APIs, and
even less true for some third party C library we're trying to
interface to.
Agree completely. Annotating C code correctly can be very
difficult. This argues against defaulting such code to @safe.
2. Annotate useClibrary() as @trusted or @system. While easier,
this causes
all benefits to @safe by default to be lost.
No. The benefit of @safe is actually having machine checkable
@safety.
3. Wrap the call to massage_data() with:
() @trusted { massage_data(parameters); } ();
If there are a lot of calls to clibrary, this is going to look
pretty awful.
Nobody likes writing or reading such ugly code. It's ok here
and there, but
not as a general thing.
Yeah, this is ugly.
4. Edit clibrary.d and make the first line:
@safe:
I submit that, just like with Java, Option 4 is what people
will reach for,
nearly every time. I've had some private conversations where
people admitted
this was what they'd do. People who knew it was wrong to do
that.
The DIP gives us 4), the worst case, by default. Anywhere and
everywhere a C lib shows up it gives us 4), automatically.
If it's @safe by default, and then someone chooses to annotate
it with @system
here and there, I'd feel a lot more confident about the
accuracy of the code
annotations than if it just had @safe: at the top. At least
they tried.
So @safe is to be based on a feeling? At least they *tried*?
This is a key point of disagreement. Machine checked @safety is
something. Human hand waving @safety is not.
It is bizarre that no one has been able to get you to see the
contradiction with your earlier writings on safety (big fan there
btw). C's biggest blunder? Yeah, well, all the bugs engendered
by that blunder and many many more are now to be considered @safe
by default. What the heck?
Finally, Atila, can you shed any light on this? Where do you
stand? Why did it seem like a good idea to withhold your veto?