D - Unsafe and doomed

Walter Bright newshound2 at digitalmars.com
Sun Jan 5 18:03:04 PST 2014


On 1/5/2014 4:20 PM, deadalnix wrote:
> On Monday, 6 January 2014 at 00:13:19 UTC, Walter Bright wrote:
>> I'd still like to see an example, even a contrived one.
>
> void foo(int* ptr) {
>      *ptr;
>      if (ptr is null) {
>          // do stuff
>      }
>
>      // do stuff.
> }
>
> The code look stupid, but this is quite common after a first pass of
> optimization/inlining, do end up with something like that when a null check if
> forgotten.

The code is fundamentally broken. I don't know of any legitimate optimization 
transforms that would move a dereference from after a null check to before, so I 
suspect the code was broken before that first pass of optimization/inlining.


> The problem here is that the if can be removed, as you can't reach that point if
> the pointer is null, but *ptr can also be removed later as it is a dead load.
>
> The resulting code won't crash and do random shit instead.

If you're writing code where you expect undefined behavior to cause a crash, 
then that code has faulty assumptions.

This is why many languages work to eliminate undefined behavior - but still, as 
a professional programmer, you should not be relying on undefined behavior, and 
it is not the optimizer's fault if you did. If you deliberately rely on UB (and 
I do on occasion) then you should be prepared to take your lumps if the compiler 
changes.


More information about the Digitalmars-d mailing list