This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]