misplaced @trust?

Zach the Mystic via Digitalmars-d digitalmars-d at puremagic.com
Thu Feb 5 12:06:36 PST 2015


On Thursday, 5 February 2015 at 19:19:51 UTC, H. S. Teoh wrote:
> - @safe should continue being @safe -- no (potentially) unsafe
>   operations are allowed, period.
> 
>   Rationale: allowing @system variables in @safe code makes the 
> function
>   non-verifiable mechanically. This completely breaks the whole 
> point of
>   @safe.
>
> - Change the meaning of @trusted (as applied to a function) to 
> require
>   @safe inside the function body, but in addition permit @system
>   variables and cast(@safe).
> 
>   Rationale: the function cannot be verified mechanically to be 
> safe,
>   therefore it cannot be marked @safe. It must be marked 
> @trusted to
>   draw attention to the fact that manual review is required. 
> However,
>   this does not constitute license to perform arbitrary @system
>   operations. Instead, any @system code/variable inside the 
> @trusted
>   function must be explicitly marked as such, to indicate that 
> these
>   items require special attention during review. Everything 
> else must
>   still conform to @safe requirements.
>
> - Introduce @system variables for holding tainted values that 
> the
>   compiler cannot guarantee the safety of, as well as 
> cast(@safe), as
>   described in Steven's post. These constructs are only 
> permitted inside
>   @trusted functions. They are prohibited in @safe code, and 
> are no-ops
>   in @system code.
>
>   Rationale: to reduce the maintainability problem, @trusted 
> functions
>   should not allow @system code by default. Rather, the scope 
> of @system
>   code/data inside a @trusted function should be restricted by 
> requiring
>   explicit marking. The compiler then helps the verification 
> process by
>   ensuring that anything not explicitly marked is still @safe.
>
>
> T

This is another interesting addition to the original proposal. My 
initial response is that if I were building the system from the 
ground up, I might not understand why a function needs to be 
redundantly marked @trusted, since the unsafe data is already 
casted(@safe) inside the function. Yet two factors start to sway 
me in favor of what you're saying, despite my initial doubt:

1. Memory safety is serious business. Forcing people to mark 
potentially unsafe functions @trusted instead of @safe, while (as 
Steven Schveighoffer pointed out) actually meaning nothing to the 
caller, will allow maintainers to more easily detect possible 
problems. In other words, it's a redundancy, but it's a GOOD 
redundancy because of how serious safety issues are. I don't know 
how strong this argument is, but it seems sound and I'm willing 
to go with it, barring good reasons not to.

2. It's already there in the language. This heavily reduces the 
"switching costs". While not a great argument in itself, to my 
mind anyway (#pleasebreakourcode ;-), it does seem more likely to 
be accepted by people who fear the change.



More information about the Digitalmars-d mailing list