I've seen code like this in a couple of old projects:
class Class {
static void Method() {}
};
((Class*)0)->Method();
This code contains undefined behavior because it includes dereferencing a null pointer (no matter what happens afterwards). It really makes no sense - the cast is there to feed the type name to the compiler and whoever wrote the code above could have written this instead:
Class::Method();
and the latter would be okay.
Why would anyone write the former code? Is it a known idiom from some good old days or what?
Static member functions were added into C++ in 1989, in Release 2.0 of the AT&T C++ Language System (pre-standardisation). Prior to that, the
static
keyword could not be used to declare static member functions, so code authors used workarounds, principally the one you have observed of indirecting a null pointer.In the Selected Readings accompanying version 2.0 of the AT&T C++ Language System, in section 1-22, Stroustrup writes:
Your code was written to compile under Cfront 1.0 or by someone who was not aware at the time of the addition of static member functions to the language.
The annotation of the member function with
static
is indeed a puzzle, as Cheers and hth. - Alf has observed; Cfront 1.0 would have rejected that code with:so it cannot have been there initially. I think Potatoswatter is most likely correct;
static
was added at a later date to document and enforce the static method attribute ofMethod
, once a C++ 2.0 compiler could be guaranteed to be available, but without the calling code being updated. To confirm this you'd need to interview the original programmer(s) or at least examine source control history (if any exists).