No, that's not true at all. You check before you dereference, which is completely legitimate. If b is NULL then the dereference never happens, exactly as it should be.
To invoke undefined behavior and strange optimizations, you'd need to rearrange the code a bit:
a = *b;
if (!b)
a = 3;
Here, the compiler can omit the if statement and its contents entirely, because b cannot be NULL, because the first line would invoke undefined behavior if it were.
A check for NULL before you dereference is always safe. It's when you do it the other way around that the compiler can start doing strange things.
To invoke undefined behavior and strange optimizations, you'd need to rearrange the code a bit:
Here, the compiler can omit the if statement and its contents entirely, because b cannot be NULL, because the first line would invoke undefined behavior if it were.A check for NULL before you dereference is always safe. It's when you do it the other way around that the compiler can start doing strange things.