On July 17, 2015 3:50:19 PM GMT+02:00, "Martin Liška" <mli...@suse.cz> wrote:
>On 07/17/2015 03:44 PM, Ulrich Weigand wrote:
>> Richard Biener wrote:
>>> On July 17, 2015 3:11:51 PM GMT+02:00, Ulrich Weigand
><uweig...@de.ibm.com> wrote:
>>>> (Since there is no C++ operator new involved at all anymore,
>>>> this clearly violates even the C aliasing rules ...)
>>>>
>>>> I really think the allocate routine needs to be more careful to
>>>> avoid violating aliasing, e.g. by using memcpy or union-based
>>>> type-punning to access its free list info.
>>>
>>> As far as I understand the object allocator delegates construction
>to callers and thus in the above case cselib
>>> Would be responsible for calling placement new on the return value
>from
>>> Allocate.
>> 
>> Ah, it looks like I was wrong above: the code uses the *object*
>> allocator, so it should go through a placement new here:
>>   inline T *
>>   allocate () ATTRIBUTE_MALLOC
>>   {
>>     return ::new (m_allocator.allocate ()) T ();
>>   }
>> 
>> It's still being miscompiled at least by my GCC 4.1 host compiler ...
>> 
>> Bye,
>> Ulrich
>> 
>
>Hi.
>
>I've just wanted to write you that it really utilizes a placement new
>:)
>The first example that bypasses pool allocator is of course a bug, I'll
>fix.
>
>Question is why aliasing oracle still wrongly aliases these pointers?
>Another option (suggested by Martin Jambor) would be to place
>::allocate implementation
>to alloc-pool.c file.

Note that all compilers up to 4.4 have aliasing issues with placement new.
A fix is to move the placement new out-of-line.

Richard.

>Thoughts?
>Martin


Reply via email to