Safe cast away from immutable
Jesse Phillips via Digitalmars-d
digitalmars-d at puremagic.com
Mon Feb 8 11:33:54 PST 2016
On Monday, 8 February 2016 at 19:07:01 UTC, Iakh wrote:
> import std.stdio;
>
> struct S
> {
> void[] arr;
>
> auto f() pure @safe
> {
> int[] a = new int[4];
> arr = a;
> return a;
> }
> }
> void main() @safe
> {
> S s;
> immutable a = s.f();
> int[] b = (cast(int[])s.arr);
> writeln(a);
> b[0] = 1;
> writeln(a);
> }
>
> http://dpaste.dzfl.pl/13751913d2ff
I'm pretty sure this is not safe. Works, but not safe. You happen
to be referencing the same memory block you created on the heap,
but I believe the compiler is free to move the memory around if
it can find a reason to do so.
Remember, when you cast the compiler is no longer protecting you.
By modifying the array you're taking on the responsibility to
know where that memory is located.
More information about the Digitalmars-d
mailing list