[CLN-list] Aliasing rules and the -f[no-]strict-aliasing switches

Richard B. Kreckel kreckel at ginac.de
Sat Mar 12 23:52:18 CET 2005


Hi!

Can anyone please explain what -f[no-]strict-aliasing and
-W[no-]strict-aliasing do?  (Yes, gcc accepts -Wno-strict-aliasing!)  I'm
experiencing some mild nausea because of type-punning in a library I'm
maintaining.  Gcc's documentation is not very clear, talking only about
types being "almost the same".  And unfortunately I have no copy of the
holy standard lying around..  Also, Google appears to turn up only
confused and confusing arguments, to this issue...  :-(

I was under the impression that pointers to some data structures are
"almost the same", but apparently this is wrong:

class Base {
public:
    int x;
};

class Derived : public Base {
public:
    Derived() { x = 24; }
    virtual ~Derived() {}  // (1)
};

class Manager {
public:
    union {
	void* pointer;
	Base* basepointer;
    };
};


#include <iostream>
using namespace std;
int main()
{
    Derived* mp = new Derived;
    Manager obj;
    obj.pointer = mp; // (2)
    cout << mp->x << endl;
    cout << obj.basepointer->x << endl;
}

When compiled with GCC 3.x or 4.x, this results in:
24
134515352

With GCC 2.95, it resulted in:
24
24

Okay, removing the vtable in Derived (1) or adding one in Base (by adding
a virtual dtor) appears to fix the program.  Obviously, assigning to
basepointer, as opposed to pointer (2) fixes it, too.

But: As it stands, is the program really wrong?  And: Why does
-f[no-]strict-aliasing not make a difference.  And should not
-Wstrict-aliasing issue a warning?

Regards
   -richy.
-- 
Richard B. Kreckel
<http://www.ginac.de/~kreckel/>





More information about the CLN-list mailing list