When does invoking a member function on a null instance result in undefined behavior?
- by GMan
This question arose in the comments of a now-deleted answer to this other question. Our question was asked in the comments by STingRaySC as:
Where exactly do we invoke UB? Is it calling a member function through an invalid pointer? Or is it calling a member function that accesses member data through an invalid pointer?
With the answer deleted I figured we might as well make it it's own question.
Consider the following code:
#include <iostream>
struct foo
{
void bar(void) { std::cout << "gman was here" << std::endl; }
void baz(void) { x = 5; }
int x;
};
int main(void)
{
foo* f = 0;
f->bar(); // (a)
f->baz(); // (b)
}
We expect (b) to crash, because there is no corresponding member x for the null pointer. In practice, (a) doesn't crash because the this pointer is never used.
Because (b) dereferences the this pointer (this->x = 5;), and this is null, the program enters undefined behavior.
Does (a) result in undefined behavior? What about if both functions are static?