This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Strict aliasing plus placement new / explicit destructor call
- From: Justin Lebar <justin dot lebar at gmail dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Tue, 27 Jul 2010 11:57:01 -0700
- Subject: Strict aliasing plus placement new / explicit destructor call
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.
Thanks for your help,
-Justin
template <class T>
class Lazy
{
public:
char bytes[sizeof(T)];
void construct() {
new(bytes) T();
}
~Lazy() {
T* obj = reinterpret_cast<T*>(bytes);
obj->~T();
}
};
class FooBase {
public:
~FooBase() {
*n = 0; // line 20 (where the error is)
}
int *n;
};
class Foo : public FooBase {
public:
int num;
};
int main()
{
Lazy<Foo> foo;
return 0;
}