@trusted attribute should be replaced with @trusted blocks
Joseph Rushton Wakeling
joseph.wakeling at webdrake.net
Thu Jan 16 11:50:26 UTC 2020
On Thursday, 16 January 2020 at 03:34:26 UTC, Timon Gehr wrote:
> You have to be careful when writing a @trusted function, not
> when calling it. If you do not trust a given library, there is
> no reason to be more careful around a @trusted API than around
> a @safe API, as they do not mean different things.
Thanks for being patient enough to clarify the issues here. This
helps to make much clearer the thinking behind the point of view
that's been articulated elsewhere in this discussion, that the
@trusted/@safe distinction is there for library maintainers
rather than users.
I agree that it's _primarily_ there for maintainers, but I don't
agree that it has _no_ value for users (more on that below). But
your observations do make clear how unreasonable my rather
judgemental "I'm coming to the conclusion ..." remarks were, so
apologies to everyone for that.
(It's no excuse, but I was quite tired when I wrote that, and so
probably not exercising as much good judgement as I ought.)
> @safe does not fully eliminate risk of memory corruption in
> practice, but that does not mean there is anything non-absolute
> about the specifications of the attributes.
Would we be able to agree that the absolute part of the spec of
both amounts to, "The emergence of a memory safety problem inside
this function points to a bug either in the function itself or in
the initialization of the data that is passed to it" ... ?
(In the latter case I'm thinking that e.g. one can have a
perfectly, provably correct @safe function taking a slice as
input, and its behaviour can still get messed up because the user
initializes a slice in some crazy unsafe way and passes that in.)
> As I am sure you understand, if you see a @safe function
> signature, you don't know that its implementation is not a
> single @trusted function call
Yes, on this we agree. (I even mentioned this case in one of my
posts above.)
> so the difference in signature is meaningless unless you adhere
> to specific conventions
Here's where I think we start having a disagreement. I think it
is meaningful to be able to distinguish between "The compiler
will attempt to validate the memory safety of this function to
the extent possible given the @trusted assumptions injected by
the developer" (which _might_ be the entirety of the function),
versus "The safety of this function will definitely not be
validated in any way by the compiler".
Obviously that's _more_ helpful to the library authors than
users, but it's still informative to the user: it's saying that
while the _worst case_ assumptions are the same (100%
unvalidated), the best case are not.
> (which the library you will be considering to use as a
> dependency most likely will not do).
Obviously in general one should not assume virtue on the part of
library developers. But OTOH in a day-to-day practical working
scenario, where one has to prioritize how often one wants to
deep-dive into implementation details -- versus just taking a
function's signature and docs at face value and only enquiring
more deeply if something breaks -- it's always useful to have a
small hint about the best vs. worst case scenarios.
It's not that @safe provides a stronger guarantee than @trusted,
it's that @trusted makes clear that you are definitely in
worst-case territory. It's not a magic bullet, it's just another
data point that helps inform the question of whether one might
want to deep-dive up front or not (a decision which might be
influenced by plenty of other factors besides memory safety
concerns).
The distinction only becomes meaningless if one is unable to
deep-dive and explore the library code.
>> I'm coming to the conclusion that much of the differences of
>> opinion in this thread are between folks who want to see
>> things as absolutes, and folks who recognize that these
>> features are tools for mitigating risk, not eliminating it.
>>
>
> I was not able to figure out a response to this sentence that
> is both polite and honest.
Well FWIW, don't feel the need to be polite to me if you don't
think I deserve it :-) But in any case, apologies again to
everyone for those remarks. They were unfair and based on a
misinterpretation of the positions being articulated.
More information about the Digitalmars-d
mailing list