DIP 1025--Dynamic Arrays Only Shrink, Never Grow--Community Review Round 1

Dennis dkorpel at gmail.com
Mon Nov 11 22:20:41 UTC 2019


On Monday, 11 November 2019 at 21:41:14 UTC, Walter Bright wrote:
> That's right. I had overlooked that.

It looked like you were aware since you mentioned "although that 
will generate more GC garbage if used in a loop" when referring 
to the workaround of `a = a ~ b`.

> Imagine these 3 lines are spread out over a large code base.

With or without this DIP, that would be problematic.

> On Monday, 11 November 2019 at 21:41:14 UTC, Walter Bright 
> wrote:
> Memory safety cannot be achieved without control over who is 
> the owner of memory.
>
>> I would like to see an example of memory corruption in `@safe` 
>> code that can happen because of slice appending.
>
>   @trusted void myfree(void* p) { free(p); }
>   free(slice.ptr);

free cannot be @trusted on a raw pointer type.
In that definition, you can (from @safe code) give `myFree` a 
pointer to a local variable, global variable or GC pointer, all 
of which may corrupt memory. (And I'm ignoring the lack of @live 
here. Without @live you can obviously add double free / 
use-after-free to that list.)

The only way to make `free` safe is to encapsulate it in a struct 
or class that ensures the pointer that is being freed was 
allocated with malloc. If you have a custom type, then 
concatenation like ~= will not work unless you implement it, so 
disabling it on the built-in slice type does not do much good.

In fact, you can consider ~= only syntactic sugar for a call to 
_d_arrayappendcTX.
You can disable the ~= construct, but everywhere you would use 
that operator you can still do something functionally equivalent 
and change what kind of data (i.e. stack memory, heap memory) the 
slice refers to.

So the current proposal helps discouraging certain code, but it 
does not prevent anything.


More information about the Digitalmars-d mailing list