On Tuesday, 10 February 2015 at 05:18:26 UTC, Andrei Alexandrescu wrote:
On 2/9/15 9:06 PM, Dicebot wrote:
On Tuesday, 10 February 2015 at 04:05:35 UTC, Andrei Alexandrescu wrote:
On 2/9/15 8:03 PM, Zach the Mystic wrote:
You could put the 'trusted' template right in object.d, to save people the awkward burden of importing it from std.conv all the time. But that
would be a language change, of sorts.

We won't define it. Instead we'll go with Steve's idea: () @trusted => expr. It's not much longer and it's a teensy bit more awkward -
exactly what the doctor prescribed. -- Andrei

Erm. This was exactly how all those trustedFoo() nested functions have appeared - we wanted to localized unsafe operations with `() @trusted
{}` but it wasn't properly inlined by DMD.

Correct. The new rules, however, prohibit using trusted code inside @safe functions. -- Andrei

There's something weird going on.

H.S. Teoh's idea for @system blocks was actually an attempt to reconcile Walter's stated desire to have @trusted interfaces at the named function level with the practical need to specify precisely which code was @system and allow safety checking for all the rest. The @system blocks were originally a way to still have a use for named @trusted functions, even in the presence of specific @system blocks. But named @trusted functions become a redundancy when all @system code is precisely marked. David Nadlinger originally pointed out almost three years ago that from the caller's perspective, there is *no* difference between @safe and @trusted. They are both effectively @safe.

The only ostensible explanation for the existence of @trusted was to point a programmer who had already identified problems with memory safety to the possible locations of the unsafe code. This is arguably not a good enough reason to invent a whole new built-in function attribute, but there it is. When you mark a function @safe, you are expected to make sure it's safe. It's not really the concern of a function attribute how you made sure it was safe.

@trusted lambdas are an effective way of marking unsafe code. But they are completely pointless, at this time, unless they are placed within the context a function marked (or inferred) @safe. For them to become the idiomatic way of marking @system code, there is no further purpose to any *named* @trusted function, ever.

To preserve the (admittedly marginal) utility of named @trusted functions -- that is, the opportunity for programmers using a library which contains only the interface function signatures and a binary object file to more clearly identify which of the used functions might be causing their memory safety problems -- while also allowing safety checking of all @trusted code outside specifically marked @system blocks, would require a breaking change, as indicated in the @system blocks proposal.

Avoiding the breaking change requires using @trusted lambdas in place of @system blocks. This nullifies the original purpose of named @trusted functions, as any code which effectively uses @trusted lambdas for their intended purpose must (implicitly or explicitly) be marked @safe.

I never used the named @trusted function for its original purpose anyway. I dont' see it as a big sacrifice, but anyway, you have three choices:

1. Keep *named* @trusted functions for their original purpose, continue to rely on the programmer for manual verification of all @trusted code, and break no code. (status quo)

2. Give up on *named* @trusted functions as a lost cause, begin using @trusted lambdas to isolate all @system code, and break no code.

3. Keep named @trusted functions, introduce @system blocks to isolate @system code, and break a lot of code.

The way I see it, number 2 is the way to go, or at least the way Andrei is headed. 3 is elegant, and if I were in charge, I'd probably investigate how to make it work. 1, the status quo, is the worst, because it preserves the thing of low value (named @trustedness) at the expense of the thing of greatest value (isolating unsafe code).

I would say "destroy", but this isn't even an idea, just an analysis of the tradeoffs. So, ENJOY!

Reply via email to