#include #include typedef struct { unsigned char a; unsigned char b; unsigned char c; } TDummy; // } __attribute__((__may_alias__)) TDummy; typedef struct { unsigned char foo; unsigned char bar; char raw[10]; unsigned char tmp; unsigned char pop; } TData; int main (int ac, char** av) { TData data; char raw[10]; TDummy* pFoo = NULL; char* pChar = NULL; // Init for (unsigned char i = 0; i < 10; ++i) { data.raw[i] = i; raw[i] = i; } // RAW ACCESS ================================================= printf ("Raw => "); for (unsigned char i = 0; i < 10; ++i) { printf ("%d", raw[i]); if (i != 9) printf (","); } printf ("\n"); // No warning pChar = raw; printf ("Void => "); printf ("%d,", *(pChar)); pChar++; printf ("%d\n", *(pChar)); pChar++; // No warning - Why ??? pFoo = (TDummy*) (raw); printf ("Dummy => %d,%d\n", pFoo->a, pFoo->b); // DATA ACCESS ================================================= printf ("Data => "); for (unsigned char i = 0; i < 10; ++i) { printf ("%d", data.raw[i]); if (i != 9) printf (","); } printf ("\n"); // No warning pChar = data.raw; printf ("Void => "); printf ("%d,", *(pChar)); pChar++; printf ("%d\n", *(pChar)); pChar++; // Strict aliasing warning - Why ??? pFoo = (TDummy*) (data.raw); printf ("Dummy => %d,%d\n", pFoo->a, pFoo->b); }