c++undefined-behavioroffsetof

Does the 'offsetof' macro from <stddef.h> invoke undefined behaviour?


Example from MSVC's implementation:

#define offsetof(s,m) \
    (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
//                                                   ^^^^^^^^^^^

As can be seen, it dereferences a null pointer, which normally invokes undefined behaviour. Is this an exception to the rule or what is going on?


Solution

  • Where the language standard says "undefined behavior", any given compiler can define the behavior. Implementation code in the standard library typically relies on that. So there are two questions:

    (1) Is the code UB with respect to the C++ standard?

    That's a really hard question, because it's a well known almost-defect that the C++98/03 standard never says right out in normative text that in general it's UB to dereference a nullpointer. It is implied by the exception for typeid, where it's not UB.

    What you can say decidedly is that it's UB to use offsetof with a non-POD type.

    (2) Is the code UB with respect to the compiler that it's written for?

    No, of course not.

    A compiler vendor's code for a given compiler can use any feature of that compiler.

    Cheers & hth.,