"Dmitry Olshansky"  wrote in message news:ltv91u$2mtc$1...@digitalmars.com...

Quite recently a lot of work has been done to make most of Phobos usable in @safe code.

While a very welcome effort, it caused a number of doubts in particular due to the boilerplate required to isolate a small amount of unsafe operations and slap "@trusted" over it.

See e.g. Denis argument:
https://github.com/D-Programming-Language/phobos/pull/2465

There were proposals for language changes along the lines of having @trusted block alike to debug/version blocks, but nothing ever came out of them.

Without language support I decided it worth a shot to create a universal wrappers to establish a consistent convention. A use of such wrapper should indicate that a @system function call or language feature was hand-verified.



What do you guys think?

I think this is an abuse of @trusted. It takes unsafe operations, and re-presents them as @safe options by renaming them. Now, you can do use @system things in @safe functions without the compiler detecting it.

Take the `addrOf` function for example. This is equivalent to adding a new version of the '&' operation, which does exactly the same thing except it's allowed in @safe code. The `addrOf` function should _not_ be @trusted, because when used from @safe code it can cause escape the address of a local etc, just like '&' can.

Because these functions violate the meaning of @trusted, that @trusted functions must be @safe although the compiler can't prove them @safe, you've increased the surface of @trusted. Now an audit of @trusted code must include all functions that call `addrOf` and friends.

I don't think this is a good idea. Each time @trusted is used, it should be on a function that is completely @safe to call. I think this is worth more than the cost in verbosity.

Lambdas and nested functions are special in that they can't be called from other code, so they only have to be @safe in the context of the enclosing function. They do still need to make sure they don't violate @safe, otherwise the entire enclosing function will need to be manually checked.

eg
void fun(int a) @safe
{
...
   p = @trusted () { return &a; }
...
}

This function is now essentially @trusted, because although the unsafe '&' operation was inside the trusted block, the @safe function now has a pointer it should not have been able to get.

Reply via email to