[ub] type punning through congruent base class?

Jens Maurer Jens.Maurer at gmx.net
Thu Jan 16 22:48:59 CET 2014


On 01/16/2014 09:17 PM, Herb Sutter wrote:
>>>> |   struct B { int x; };  // 1
>>>> |   void* p = malloc(sizeof(B)); // 2
>>>> |   B* pb = static_cast<B*>(p); //3
>>>> |   pb->x = 17; // 4
>>>> |
>>>> | I take it as obvious that the lifetime of an object of type B has
>>>> | begun somewhere in this code snippet. 

>>>> Well, in fact I don't take it obvious that the lifetime of an object
>>>> has even begun!
>>>> I don't even see that or object has been constructed or initialized.
>>>
>>> Agreed. I would expect line 4 to be at least unspecified behavior and
>>> probably undefined behavior.
> 
> OK, let me back this off to just "I would expect that in this code no lifetime of any object has begun."

So, a subsequent read of "pb->x" would then be undefined behavior
according to 3.8p5 bullet 2?

This seems to break C compatibility, since the code above (after replacing
the static_cast) certainly works as expected in C.

I have no objections to someone rewriting 3.8 basic.life to suit feelings
about the intuitive meaning of "lifetime", but let's please have a holistic
approach in a paper.

Jens


More information about the ub mailing list