[Issue 23175] New: -preview=in silently adds possible stack memory escape

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Jun 9 13:15:39 UTC 2022


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

          Issue ID: 23175
           Summary: -preview=in silently adds possible stack memory escape
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: safe, spec
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: schveiguy at gmail.com

In the current specification, an `in` parameter is defined as equivalent to
`const`, as long as you don't use the `-preview=in` switch.

Consider this existing code, written with the assumption that `in` is `const`:

```d
string foo(in string s)
{
   return s;
}
```

This code is perfectly valid, does not cause memory corruption, and is
functionally equivalent to:

```d
string foo(const string s)
{
   return s;
}
```

However, turn on `-preview=in`, and now the function implies that the `s`
parameter is `scope`.

Turn dip1000/dip25 on, and now, the compiler assumes that `s` is not returned,
and so it can allocate an array literal on the stack:

```d
auto s = foo(['a']); // s now points to temporary stack data that is out of
scope.
```

However, without the preview switches, the compiler allocates the array on the
heap.

This can lead to memory corruption via dangling pointers in @system code, that
wasn't present without the preview switches.

If preview in is going to change the semantics of parameters in a way that
allows the compiler to introduce memory corruption, this usage *must* be warned
about, either in the current compiler, or with an enabled switch (possibly
dip1000), before it is turned on by default.

--


More information about the Digitalmars-d-bugs mailing list