On Sunday, 24 May 2020 at 01:26:02 UTC, ag0aep6g wrote:
On 24.05.20 02:55, Arine wrote:
That works even if you make the static this() @safe, and remove the pointer incrementation.

Sure. `*p = 13;` is perfectly @safe. The static constructor isn't needed for that part. You can just as well do the assignment in `main`. The static constructor is another feature that can smuggle unsafe code (the increment) into your program without the @trusted warning label.

It'd be no different than passing the pointer into @safe code as a parameter from @system code. Ultimately the error occurs in @system code and directly as a result of @system code. It is undefined behavior as well. No amount of safe code can save you from that.

You'd have to make the p initialization @safe.

     @safe:
         int* p = cast(int*) &x; // error

But note this doesn't work:

     @safe int* p = cast(int*) &x; // compiles

Having the default become @safe will help detect this, as I don't imagine that is a whole lot of usage of @safe: to begin with.

The example compiles with `-preview=safedefault`. And even if that gets changed, it will probably still compile when marked @system. So we still won't find it when looking for "@trusted".

Then that is definitely a bug if that's the case. Someone should probably make a bug report, Walter? If you are still using @system with @safe, then that would still be somewhere you have to look for not memory safe code. @trusted should just mean that someone verified it. @system then would mean no one's verified it to be safe, that doesn't mean you don't have to check it.

Reply via email to