@trust is an encapsulation method, not an escape
Tobias Pankrath via Digitalmars-d
digitalmars-d at puremagic.com
Fri Feb 6 03:14:11 PST 2015
On Friday, 6 February 2015 at 08:58:05 UTC, Walter Bright wrote:
> On 2/6/2015 12:31 AM, Kagamin wrote:
>> On Thursday, 5 February 2015 at 23:39:39 UTC, Walter Bright
>> wrote:
>>> static void trustedMemcopy(T[] dest, T[] src) @trusted
>>> {
>>> assert(src.length == dest.length);
>>> memcpy(dest.ptr, src.ptr, src.length * T.sizeof);
>>> }
>>
>> Should be enforce: assert doesn't guard against malicious
>> usage.
>
> Cue my endless attempts to explain the difference between input
> errors and logic errors :-(
I agree with you, that this should be an assert, but then it
cannot be @trusted. A @trusted function should provide it's
guarantee for all input that can be crafted in @safe code. This
is why this
void bar()
{
ubyte[] a;
a.ptr = 0; // arbitrary value as long as NOT from an allocator
a.len = 1;
setToZero(a);
}
is not a valid counter-example and that memcpy cannot be
@trusted. It has no safe interface.
Back to topic. Since @trusted must provide a safe interface, I
don't think it makes much sense to attach @trusted to smaller
code blocks than functions. That might not be true for the
opposite: @safe blocks where the compiler turns the safety check
back on.
This prevents that a @trusted/@safe function becoming @system
breaks the @trusted guarantee of called functions.
void bar(void* argument) @trusted { ... }
void forward() @trusted
{
// REVIEW: forwards arguments to bar, which is @trusted, so
we can
// trust forward as well
void* p = malloc(...);
bar(arguments);
free(p);
}
Changing bar to @system is a breaking change and currently a
silent one. This is a maintenance problem I see as well. Solution:
void forward() @trusted
{
void* p = malloc(...);
// safe is bar is safe, so turn compiler checks on again.
@safe { bar(p); }
free(p);
}
Introducing an error in an @trusted function is _not_ an
maintenance horror. While your @safe-ty guarantee is out of the
window, it can be catched my reviewing one function: the one
where the error is introduced in. Making a @trusted function
@system forces us to review all @trusted functions calling the
now @system function.
More information about the Digitalmars-d
mailing list