@trusted considered harmful
Lars T. Kyllingstad
public at kyllingen.net
Sat Feb 16 02:12:20 PST 2013
On Saturday, 28 July 2012 at 00:08:30 UTC, David Nadlinger wrote:
> @trusted in its current form needs to go. Its design is badly
> broken, as it leaks implementation details and encourages
> writing unsafe code.
>
> The Problem
> ———————————
>
> [...]
>
> A Solution
> ——————————
>
> Let me make something clear first: I am _not_ intending to
> remove @trusted from the language. As a bridge between the
> @safe and @system worlds, it is an integral part of SafeD. What
> I'm proposing is:
>
> 1) Remove the distinction between @safe and @trusted at the
> interface (ABI, API) level. This implies changing the name
> mangling of @trusted to Nf, and consequently removing the
> distinction in DMD altogether (at least in user-facing parts
> like .stringof and error messages). In theory, this is a
> breaking change, but as any code that doesn't treat them the
> same is buggy anyway, it shouldn't be in practice. As for
> std.traits.FunctionAttribute, we could either make trusted an
> alias for safe, or just remove documentation for the former and
> keep it around for some time (there is no way to deprecate an
> enum member).
>
> 2) The first step is necessary, but mainly of cosmetic nature
> (think `pure`, `pure2`). We still need to address for the
> granularity and attribute inference problem. The obvious
> solution is to add a "@trusted" declaration/block, which would
> allow unsafe code in a certain region. Putting @trusted in the
> function header would still be allowed for backwards
> compatibility (but discouraged), and would have the same effect
> as marking the function @safe and wrapping its whole body in a
> @trusted block. It could e.g. look something like this (the @
> prefix definitely looks weird, but I didn't want to introduce a
> new keyword):
>
> ---
> void foo(T)(T t) {
> t.doSomething();
> @trusted {
> // Do something dirty.
> }
> t.doSomethingElse();
> @trusted phobosFunctionWhichHasNotBeenMarkedSafeYet();
> }
> ---
>
> This is similar to other constructs we have today, for example
> debug {}, which allows impure code. It can be debated whether a
> block »argument« should introduce a new scope or not (like
> static if). The latter currently seems much more attractive to
> me, but I suppose it could be confusing for some.
>
> In any case, while there is probably quite a bit of
> bikeshedding to be done for 2), I don't think there is much
> controversy about 1). So, let's try to get this done shortly
> after the 2.060 release – as discussed above, it is very
> unlikely that the change will break something, but the odds
> still increase over time. Also, there is currently a Phobos
> pull request [4] which will be influenced by the outcome of
> this discussion.
I completely agree with the above. @trusted should be applied to
as small blocks of code as possible -- preferably to individual
statements -- to make it easier for the programmer to verify and
maintain the safety of the code.
Lars
More information about the Digitalmars-d
mailing list