Re: Strict aliasing plus placement new / explicit destructor call

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 07/28/2010 06:57 AM, Ian Lance Taylor wrote:
> Justin Lebar <justin.lebar@xxxxxxxxx> writes:
> 
>> I'm trying to enable -fstrict-aliasing when building Firefox.  One
>> class in particular is proving difficult to make work properly.  We
>> use this class for lazily allocating objects on the stack.
>>
>> Code is included at the end of this e-mail.  When I compile with -O2
>> -Wall, I get
>>
>>    main.cpp:20: warning: dereferencing pointer ‘this.0’ does break
>> strict-aliasing rules
>>
>> It seems that this warning is due to the cast in ~Lazy().  Note that I
>> can't rewrite Lazy<T>'s storage as a union because T may have a
>> constructor -- the whole purpose of the Lazy class is to let me
>> stack-allocate T without immediately calling its constructor.
>>
>> Also, changing
>>
>>       T* obj = reinterpret_cast<T*>(bytes);
>>
>> to
>>
>>       T* __attribute__((may_alias)) obj = reinterpret_cast<T*>(bytes);
>>
>> doesn't eliminate the warning.
>>
>> I'm out of ideas.  Is there a way to accomplish what I'm trying to do
>> here without disabling strict aliasing?  I'd hate to give up now.
> 
> Your code looks OK to me by the C++ aliasing rules--at least it would
> look OK if your program actually called construct.  In this case I think
> the warning is incorrect.  Current mainline does not seem to give that
> warning.

Yes, the code looks OK to me too.  My worry is that incorrect alias
analysis may result in incorrect code being generated.  But perhaps
there's nothing to worry about because the warning is independent of
the alias analysis used by the compiler.

Andrew.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux