On 4/12/2014 4:57 AM, deadalnix wrote:
On Friday, 11 April 2014 at 06:29:39 UTC, Nick Sabalausky wrote:
Realistically, I would imagine this @trusted part should *always* be a
dummy wrapper over a specific @system function. Why? Because @trusted
disables ALL of @safe's extra safety checks. Therefore, restricting
usage of @trusted to ONLY be dummy wrappers over the specific parts
which MUST be  @system will minimize the amount of collateral code
that must loose all of @safe's special safety checks.


No.

Trusted is about providing a safe interface to some unsafe internals.
For instance, free cannot be safe. But a function can do malloc and free
in a safe manner. That function can thus be tagged @trusted .


The problem with that is @trusted also disables all the SafeD checks for the *rest* of the code in your function, too.

To illustrate, suppose you have this function:

void doStuff() {
    ...stuff...
    malloc()
    ...stuff...
    free()
    ...stuff...
}

Because of malloc/free, this function obviously can't be @safe (malloc/free are, of course, just examples here; they could be any @system functions).

Problem is, that means for *everything* else in doStuff, *all* of the ...stuff... parts, you CANNOT enable the extra safety checks that @safe provides. The use of one @system func poisons the rest of doStuff's implementation (non-transitively) into being non-checkable via SafeD.

However, if you implement doStuff like this:

// Here I'm explicitly acknowledging that malloc/free are non-@safe
@trusted auto trustedWrapperMalloc(...) {...}
@trusted auto trustedWrapperFree(...) {...}
void doStuff() {
    ...stuff...
    trustedWrapperMalloc()
    ...stuff...
    trustedWrapperFree()
    ...stuff...
}

*Now* doStuff can be marked @safe and enjoy all the special checks that @safe provides.

Reply via email to