Should phobos functions generally be @safe or @trusted?

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Fri Jan 22 05:16:26 PST 2016


On 1/21/16 10:43 PM, Chris Wright wrote:
> I wanted to use std.array.insertInPlace in a @safe module. It's not
> marked @safe or @trusted. The string implementation uses pointer
> arithmetic, and the non-string implementation uses memmove.
>
> Should things like this be marked @trusted in general?
>
> Presumably if a function isn't memory-safe, it doesn't just cause memory
> errors arbitrarily; there's likely something the caller has to do to
> ensure the function doesn't crash or cause memory corruption. It seems
> like that should be documented. When it's not documented, I start feeling
> a bit paranoid.

@trusted is not something that should be used lightly. If you mark an 
entire function @trusted, it has to be hand checked for safety. Any 
possible corruption must be dealt with. This is not easy to do.

Not to mention, any changes to the function must be hand checked since 
the compiler is not checking them.

If a function is a template, then I think we should never mark it 
@trusted, as this can result in calling unsafe @system functions without 
intention (imagine that something that's normally an innocuous field is 
actually a method that is system, now you just escaped it). In addition, 
templates will naturally infer @safety if not marked (I assume this was 
the intention for insertInPlace).

Typically, we use a trusted escape block (a lambda marked trusted that 
is immediately called) to do unsafe things within a @safe function.

I haven't looked at the function in question, but I would guess that 
most of phobos should be marked or inferred @safe, with @trusted 
escapes. That one does seem like one that should be @safe in most cases.

> Should it be a bug if a non- at safe, non- at trusted function doesn't document
> what you need to do to call it safely?

If there is a dependency on @safety, it should probably be noted. That 
is, if there are ways to call it that allow it to be @safe in some cases 
and @system in others, then we should identify those in the docs. Is it 
a bug? No more than any other doc omission is a "bug".

-Steve


More information about the Digitalmars-d mailing list