@trusted attribute should be replaced with @trusted blocks

Joseph Rushton Wakeling joseph.wakeling at webdrake.net
Thu Jan 16 01:43:14 UTC 2020


On Thursday, 16 January 2020 at 00:40:12 UTC, ag0aep6g wrote:
> And that isn't useful to a user in any way.

The fact that I personally find it useful -- and going by this 
discussion thread, so do some others -- means that this claim 
can't possibly be true.

> I don't agree. @trusted doesn't alert you any more of the 
> possibility of a memory safety bug than @safe. You can't assume 
> that an @safe function won't corrupt your memory any more than 
> you can assume the same about an @trusted function.

@safe on a function tells you no more than it promises: that the 
compiler will alert you to any memory safety violations it is 
able to detect in that function's implementation.  If it does not 
detect any, that could be because none are present, or it could 
be that at some point nested inside the code it calls there is 
something @trusted that the compiler does not attempt to validate.

@trusted on a function, on the other hand, explicitly tells you 
that its safety is contingent on something other than compiler 
validation, and that you should not expect the compiler to 
validate _any_ part of its internals.

Do you seriously not see any difference between an annotation 
that tells you: "this function should be memory-safe, and the 
compiler will attempt to validate this to the best of its 
ability" versus, "this function should be memory-safe, but the 
compiler will not make any attempt to validate that"?  And do you 
seriously not see any value in having that distinction clear?

Obviously the allegedly @safe function _could_ just be a thin 
wrapper around a @trusted lambda containing all sorts of horrible 
crack.  But on balance of probabilities, in any library written 
by vaguely competent people, that should probably not be your 
_first_ assumption.

> (It is useless, though.)

Don't mistake "I don't find it useful" for "No one finds it 
useful".

> Yes, but you find those interesting bits by grepping over the 
> source code, not by looking at the attributes of public 
> functions. Many @safe functions have @trusted innards that 
> don't show up in API documentation.

FWIW I do think it may be a bit of a code smell or anti-pattern 
to have nested @trusted functions inside @safe functions.  Of 
course, there's still the possibility that a @safe function can 
call some external but private @trusted function, but it reduces 
the attack space if the internal code of a @safe function can be 
fully validated _in its own terms_ (i.e. if it can be validated 
that there is nothing _inside the function_ that could cause a 
memory safety bug).

BTW, that's part of the motivation for my suggestions at the 
beginning of this thread about how @trusted could be improved:
https://forum.dlang.org/post/heujvxcsppiyagxfvliv@forum.dlang.org

If the compiler would validate all the contents of @trusted 
functions except for lines contained in `@system { ... }` blocks 
(see the original example if it's not clear what I mean), then 
that would probably be a preferred way to achieve what developers 
currently do using @safe functions with some nested @trusted 
lambdas.  And that would probably mean that APIs would be 
annotated in a more informative way about the _true_ risk of 
memory safety bugs.


More information about the Digitalmars-d mailing list