On Wednesday, 8 March 2017 at 22:38:24 UTC, XavierAP wrote:
On Wednesday, 8 March 2017 at 21:02:23 UTC, Moritz Maxeiner wrote:
[...]

The operating word here being "can". The above is semantically equivalent (assuming the delegate gets optimized out) to an unsafe block inside a Rust function. And yes, that's what I consider hidden unsafe code, and it means that if you call function `bar` from a @safe function `foo`, `bar` being marked as @safe does not save you from auditing `bar`'s source code.

Indeed safety isn't transitive as I thought. @safe may call @trusted, which may include any unsafe implementation as long as the external interface does not. I suppose it was decided back at the time that the opposite would be too restrictive. Then truly safe client code can rely on simple trust established from the bottom up originating from systems unsafe code that is at least hopefully long lasting and stable and more tested (even if manually lol).

If the use case has no problem with that kind of trust, indeed. Unfortunately even already long established, and presumably stable C APIs have tended to turn into horrible nightmares on many an occasion. *cough* openssl *cough*, so this will need to be something to evaluate on a project by project, dependency by dependency basis imho.


If client code, often rapidly updated, scarcely tested and under pressure of feature creep, is written in @safe D, this can still reduce the amount of failure modes.

I don't disagree with that. Writing your own code in @safe has considerable advantages (first and foremost personal peace of mind :) ). It's just that other people writing their code in @safe does not provide you as a potential user of their code with any guarantees. You need to either extend those people the exact kind of trust you would if they had written their code in @system, or audit their code. It does make auditing considerably faster, though, since you can search for all instances of @trusted and evaluate their internals and how they're being interfaced with (i.e. you can omit auditing @safe functions that don't call @trusted functions).


Also at least as of 2010 Andrei's book stated that "At the time of this writing, SafeD is of alpha quality -- meaning that there may be unsafe programs [@safe code blocks] that pass compilation, and safe programs that don't -- but is an area of active development." And 7 years later in this forum I'm hearing many screams for @nogc but little love for @safe...

Well, I can't speak for others, but I generally just use the GC for most things (which is by definition memory safe sans any bugs) and when I do need to step outside of it I use scope guards, refcounting, and have valgrind run (the only annoying part about valgrind with D is that there are some 96 bytes that it always reports as possibly lost and you have to suppress that). Also, when I look at the list of things forbidden in @safe[1] I don't see anything I actually do, anyway, so the current implementation status of safe has so far not been a particular concern of mine.

[1] https://dlang.org/spec/function.html#safe-functions

Reply via email to