On Monday, 6 January 2014 at 00:13:19 UTC, Walter Bright wrote:
On 1/5/2014 3:59 PM, deadalnix wrote:
because it is known to fool optimizer and cause really
nasty bugs (typically, a pointer is dereferenced, so the optimizer assume it isn't null and remove null check after the dereference, and then the dereference
is removed as it is dead.

I'd like to see a case where this is nasty. I can't think of one.


A recent linux kernel exploit was caused by this. Reread carefully, this nasty behavior is created by the optimizer, and avoiding it mean preventing the optimizer to optimize aways loads, unless it can prove the pointer is non null. As D is meant to be fast, this limitation in the optimizer is highly undesirable.

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 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.

Reply via email to