www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - cast const pointer to non-const and change value yields neither result

reply Timoses <timosesu gmail.com> writes:
Hey,

reading through https://dlang.org/articles/const-faq.html and 
experimenting a bit:

```
     immutable int i = 3;
     const(int)* p = &i;

     int* q = cast(int*)p;

     assert(q == p && p == &i);

     writeln(i); // 3
     *q = 1;     // Why does this have no effect at all? No error 
no nothing?!
     writeln(i); // 3
```

When changing i to non-immutable the `*q=1` sets i to 1.

There is no error message. The `*q=1` simply has no effect at 
all. Also with `const int i`.

Is that intended?
Apr 30 2018
parent Stefan Koch <uplink.coder googlemail.com> writes:
On Monday, 30 April 2018 at 12:35:06 UTC, Timoses wrote:
 Hey,

 reading through https://dlang.org/articles/const-faq.html and 
 experimenting a bit:

 ```
     immutable int i = 3;
     const(int)* p = &i;

     int* q = cast(int*)p;

     assert(q == p && p == &i);

     writeln(i); // 3
     *q = 1;     // Why does this have no effect at all? No 
 error no nothing?!
     writeln(i); // 3
 ```

 When changing i to non-immutable the `*q=1` sets i to 1.

 There is no error message. The `*q=1` simply has no effect at 
 all. Also with `const int i`.

 Is that intended?
Well yes. Casting away immutable is undefined behavior. This code will most probably not compile if you annotate it with safe. Precisely because it's undefined.
Apr 30 2018