[ub] Type punning to avoid copying

Ion Gaztañaga igaztanaga at gmail.com
Fri Jul 26 01:03:32 CEST 2013


El 25/07/2013 18:10, Kazutoshi Satoda escribió:
> On 2013/07/25 09:05 +0900, Nevin Liber wrote:
>> struct UDPHeader : IPHeader
>> {
>>      //...
>>      uint16_t length;
>>      //...
>>      char     data[1];
>> };
> ...
>>              f(&header.udp.data[0], &header.udp.data[header.udp.length - 8]);
> ...
>> Q1:  How many places has undefined behavior been invoked in the above?
>
> Aside from the one that Jeffrey pointed out (accessing char array via
> an glvalue of type Header)

A very useful example. I don't think many C/C++ programmers would 
correctly answer the question. I couldn't. And we have tons of code and 
years of existing practice using this union hack.

¿How can we tell the compiler that a memory buffer is really a different 
type? This is a typical situation when handling network packets, mapping 
files or shared memory, when passing data though message queues. 
Situations where we expect C/C++ will be extremely efficient.

We can tell the compiler to avoid some optimizations via "volatile" or 
"atomic<>". Maybe another mechanism is needed to tell the compiler 
(provided the memory region is correctly aligned for the type) that it 
should reinterpret the memory region as the a new type (without calling 
placement new on the buffer, which could overwrite the bits written in 
the buffer).

Best,

Ion


More information about the ub mailing list