Strict aliasing plus placement new / explicit destructor call
Ian Lance Taylor
iant@google.com
Wed Jul 28 06:00:00 GMT 2010
Justin Lebar <justin.lebar@gmail.com> 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.
Ian
More information about the Gcc-help
mailing list