Thread overview
Explaining why something isn't safe
Aug 16, 2021
Adam D Ruppe
Aug 16, 2021
bauss
Aug 16, 2021
H. S. Teoh
August 16, 2021

This just came up in a discussion, and I've thought about this in the past, so it might have already come up. But often times, you have some code that you think will be @safe, but it gets inferred to be @system. However, you can't tell where the safety violation is, so you have this process where you make a clone of all the code, marking everything as @safe, at all layers (even if they are in other projects) until you find the culprit.

As was pointed out in the discussion, the compiler knows where it decided to infer @system, would it be possible to force it to tell you that?

An example:

void foo() {}

auto bar(int x) {
   foo();
   return x * 2;
}

void main() @safe {
   auto a = bar(5);
}

The result is:

Error: `@safe` function `D main` cannot call `@system` function `bar`

Whereas it would be nice to see the error:

Error: `bar` was inferred `@system` because it calls `@system` function `foo`

Which should go all the way down to where the actual safety problem is. This is a simple example that's easy to diagnose, but often times you have a stack of template functions, and all you get is that the top layer function is @system, instead of finding where it did the unexpected inference at the bottom of the stack (or you forgot to mark a @safe non-inferred function).

This happens with stuff like format or writeln which is composed of dozens of layers of templates, and it's hard to find out which one is the one doing the unexpected inference. I have run across sometimes the inference giving up as well, which is a separate problem, but also useful to diagnose.

It would be nice to have a pragma (or maybe this can be a compiler diagnostic switch?) which shows the stack of inference that caused the safety error. Or maybe it should just always be shown? After all, it is an error, so no reason not to be fully descriptive.

-Steve

August 16, 2021
On Monday, 16 August 2021 at 12:51:26 UTC, Steven Schveighoffer wrote:
> This just came up in a discussion, and I've thought about this in the past, so it might have already come up.

Forum threads are ephemeral. Add to bugzilla plz. Then it will never be forgotten....

https://issues.dlang.org/show_bug.cgi?id=17374

.... or acted upon. 4 years and counting.
August 16, 2021
On Monday, 16 August 2021 at 13:05:48 UTC, Adam D Ruppe wrote:
> On Monday, 16 August 2021 at 12:51:26 UTC, Steven Schveighoffer wrote:
>> This just came up in a discussion, and I've thought about this in the past, so it might have already come up.
>
> Forum threads are ephemeral. Add to bugzilla plz. Then it will never be forgotten....
>
> https://issues.dlang.org/show_bug.cgi?id=17374
>
> .... or acted upon. 4 years and counting.

Damn 4 years... I think it would be a really nice addition. Especially for people who aren't used to @safe and I can imagine a lot of people just skip using it because the hassle isn't worth it.
August 16, 2021

On 8/16/21 9:05 AM, Adam D Ruppe wrote:

>

On Monday, 16 August 2021 at 12:51:26 UTC, Steven Schveighoffer wrote:

>

This just came up in a discussion, and I've thought about this in the past, so it might have already come up.

Forum threads are ephemeral. Add to bugzilla plz. Then it will never be forgotten....

https://issues.dlang.org/show_bug.cgi?id=17374

.... or acted upon. 4 years and counting.

Thanks, added my 2 cents there.

-Steve

August 16, 2021
On Mon, Aug 16, 2021 at 01:29:05PM +0000, bauss via Digitalmars-d wrote:
> On Monday, 16 August 2021 at 13:05:48 UTC, Adam D Ruppe wrote:
> > On Monday, 16 August 2021 at 12:51:26 UTC, Steven Schveighoffer wrote:
> > > This just came up in a discussion, and I've thought about this in the past, so it might have already come up.
> > 
> > Forum threads are ephemeral. Add to bugzilla plz. Then it will never be forgotten....
> > 
> > https://issues.dlang.org/show_bug.cgi?id=17374
> > 
> > .... or acted upon. 4 years and counting.
> 
> Damn 4 years... I think it would be a really nice addition. Especially for people who aren't used to @safe and I can imagine a lot of people just skip using it because the hassle isn't worth it.

I've been mostly ignoring @safe, and this is one of the reasons: it's just too annoying to use sometimes.  With long UFCS chains the current error messages just aren't helpful in finding the problem.  If this was fixed I'd be more inclined to use @safe.


T

-- 
Not all rumours are as misleading as this one.
August 16, 2021

On 8/16/21 8:51 AM, Steven Schveighoffer wrote:

>

It would be nice to have a pragma (or maybe this can be a compiler diagnostic switch?) which shows the stack of inference that caused the safety error. Or maybe it should just always be shown? After all, it is an error, so no reason not to be fully descriptive.

MoonlightSentinel has a draft PR that seems to cover this! Any chance we can get this finalized/merged? This would be an awesome addition to the compiler.

-Steve