On Friday, 19 May 2017 at 11:53:57 UTC, Steven Schveighoffer
wrote:
On 5/19/17 5:12 AM, Moritz Maxeiner wrote:
On Thursday, 18 May 2017 at 12:12:18 UTC, Steven Schveighoffer
wrote:
[...]
We still allow unsafe operations inside @safe code, using
@trusted.
This is a necessary evil, but it's so very important that the
base
libraries (druntime and phobos) keep this to a minimum, and
that we
review those @trusted blocks to death.
That and we need to make sure it is understood by everyone
using third
party @safe code that it is *not* a "I don't have to audit
this code"
free card. It merely reduced the amount of code you need to
review to
what is marked as @trusted (with regards to memory safety); as
long as
you don't *know* whether some third party code is @safe or
@trusted, you
(as the programmer) have to assume it is @trusted and that
means you
have to extend trust to the author and cannot assume any of
the @safe
guarantees for that code.
What we need are 2 things:
1. @trusted blocks need to be rock-solid in Phobos and
Druntime. And as rare as possible.
Agreed 100%.
This provides a foundation to build completely @safe libraries.
Agreed if you mean libraries being marked completely as @safe
(which I assume).
Disagreed if you mean libraries that are proven to never corrupt
memory (not possible with unsafe operating system).
It's like atomics -- they are hugely important and very easy to
get wrong.
Sure.
Leave the actual implementation to the pros.
If you mean the act of implementing: Yes, agreed.
If you mean the entire mind space of the implementation, aka you
(the programmer) receives a "get out of audit this" free card,
because "professionals" wrote it: No. You are *always*
responsible for verifying *all* third party @trusted code
*yourself*.
We should be the pros on phobos/druntime safety.
Agreed.
2. @trusted blocks in any project need to be considered red
flags. You should not need to audit @safe code.
Yes you do, because it can call into @trusted like this:
---
void foo(int[] bar) @safe
{
() @trusted {
// Exploitable code here
}();
}
---
You *must* audit third party @safe code for such hidden @trusted
code (e.g. grep recursively through such third party code for
@trusted and verify).
What you need to do is audit @trusted code when it interacts
with @safe code.
You need to audit *all* @trusted code, because you don't
necessarily control who calls it.
If you can prove that in *all cases* the @safe code is still
@safe even with the included @trusted blocks, then you don't
have to audit @safe code that calls that "tainted" function.
s/prove/promise/
But yes, that is precisely what I wrote in the above with regards
to the reduction of what you have to audit.
If we get into "@safe really means @trusted" territory, we have
lost.
For code that you write yourself, @safe means @safe, of course.
For code other people write and you want to call, it being marked
@safe does really mean @trusted as long as you yourself have not
looked inside it and verified there either is no hidden @trusted,
or verified *yourself* that the hidden @trusted is memory safe.
I consider any other behaviour to be negligent to the degree of
"you don't actually care about memory safety at all".