Thread overview
Are null refs intentionally allowed?
Jul 16, 2022
Dukc
Jul 16, 2022
Tejas
Jul 16, 2022
Dukc
Jul 16, 2022
Paul Backus
July 16, 2022

This compiles and runs just fine, printing what you'd except:

@safe void main()
{
    import std.stdio;

    int* p;
    isNull(*p).writeln;
    p = new int(5);
    isNull(*p).writeln;
}

@safe bool isNull(ref int x){return &x is null;}

The question is, is this intentional? I'm writing "DIP1000: Memory Safety in a Modern System Programming Language Pt. 2" and currently I've written that this is allowed, even when it's not in C++.

But there are still two possibilities: either this is okay by design, or works by accident but really disallowed. Which is the case?

July 16, 2022

On Saturday, 16 July 2022 at 12:33:57 UTC, Dukc wrote:

>

This compiles and runs just fine, printing what you'd except:

@safe void main()
{
    import std.stdio;

    int* p;
    isNull(*p).writeln;
    p = new int(5);
    isNull(*p).writeln;
}

@safe bool isNull(ref int x){return &x is null;}

The question is, is this intentional? I'm writing "DIP1000: Memory Safety in a Modern System Programming Language Pt. 2" and currently I've written that this is allowed, even when it's not in C++.

But there are still two possibilities: either this is okay by design, or works by accident but really disallowed. Which is the case?

It doens't compile when I run it on run.dlang.io, erroring out with:

onlineapp.d(11): Error: cannot take address of parameter `x` in `@safe` function `isNull`
July 16, 2022

On Saturday, 16 July 2022 at 12:33:57 UTC, Dukc wrote:

>

This compiles and runs just fine, printing what you'd except:

@safe void main()
{
    import std.stdio;

    int* p;
    isNull(*p).writeln;
    p = new int(5);
    isNull(*p).writeln;
}

@safe bool isNull(ref int x){return &x is null;}

The question is, is this intentional? I'm writing "DIP1000: Memory Safety in a Modern System Programming Language Pt. 2" and currently I've written that this is allowed, even when it's not in C++.

In general, dereferencing null has defined behavior and is allowed in @safe code. So I think this example is fine.

July 16, 2022

On Saturday, 16 July 2022 at 12:40:06 UTC, Tejas wrote:

>

It doens't compile when I run it on run.dlang.io, erroring out with:

onlineapp.d(11): Error: cannot take address of parameter `x` in `@safe` function `isNull`

Oh sorry, it needs -preview=dip1000