> Dereferencing a pointer further in the code shouldn't be a valid justification for optimizing out previous tests of it being null.
Not further. Anywhere. If the implementation wishes to rewrite pointer dereferences from `use(*p)` to:
if(!p) abort();
use(*p);
it may do so (undefined behaviour!), but if it chooses
not to do so, it may not later pretend that it did, and remove a explict `if(!p)` that the programmer wrote. Given:
use(*p);
if(!p) return NOPE;
this is fine:
if(!p) abort();
use(*p);
//if(!p) return NOPE; // unreachable because of if, not because of use
but not:
use(*p);
//if(!p) return NOPE; // CVE-20XX-XXXXX
The implementation can optimize based on information (like "p is not null") that is actually
true (even if that's because it
made it true), but not based on information it
assumed was true on the basis that it counterfactually
could have made it true (but didn't).
> it would prevent many classes of branch pruning.
Yes, that's the general idea.