Should modifying private members be @system?
ag0aep6g
anonymous at example.com
Fri Oct 4 13:40:28 UTC 2019
On Friday, 4 October 2019 at 12:34:46 UTC, Dennis wrote:
> In this case it's a member function. A common pattern is to put
> unsafe parts of a function in a block like this:
> () @trusted {/*do something unsafe*/} ()
>
> Such a lambda cannot be @trusted unconditionally, it's trusted
> because it is known it can only be called in its context and
> not outside the outer function's scope.
Being pedantic, if the safety of the nested function relies on
its surroundings, then it can't be @trusted. It may be a common
pattern, but it's undermining @safe anyway.
> My broader question is whether the language can be designed so
> member functions can rely on certain assumptions. Currently
> writing proper @trusted code is extremely hard because it is
> unknown what you can work with.
Agreed that writing @trusted code is hard.
> - does const give any guarantees? (afaik, yes)
Yes. It guarantees that the value won't change through the const
reference. As far as I understand, you can rely on that in
@trusted code. You can also rely on `immutable` data not ever
changing (after creation).
The flipside is that you can't break those guarantees in
@trusted/@system code. The compiler will allow it, but you must
take care not to mutate const/immutable values. Same with other
guarantees.
> - does pure give any guarantees? (no, you can return
> `cast(size_t) (new int)`)
Yeah, you can't rely on two identical calls giving the same
result.
`pure` pretty much just means "doesn't touch globals, at least
not visibly". So here:
----
int x;
void f(const int* a) pure;
void main() { f(&x); }
----
It's guaranteed that the call to f doesn't change x. Without
`pure`, it might.
> - does private give any guarantees? (currently not, but it
> could)
I don't think `private` guarantees anything with regards to
safety. Even when `__traits(getMember, ...)` and `.tupleof` and
other low-level mechanisms would respect `private`, you still
couldn't rely on it for safety. You can't trust the current
module/struct/class any more than other code.
[...]
> So with @system members, can we give any guarantees of
> integrity to member functions?
You'd have the guarantee that no @safe code can mess with the
variable.
You'd still have to make sure that all the @system and @trusted
code plays nice with each other, but that's just how it is with
non- at safe code.
That is, some other @system/@trusted function could set an
invalid _length in your struct. And then your opIndex would
violate safety. But that would just be a bug in that other
function then.
More information about the Digitalmars-d
mailing list