Michael Haubenwallner writes: > $ cat test.c > /* 1*/ extern void allocate(int size, void** p); > /* 2*/ > /* 3*/ typedef struct X { > /* 4*/ char A; > /* 5*/ } X; > /* 6*/ > /* 7*/ X* test1(void) > /* 8*/ { > /* 9*/ X *x; > /*10*/ allocate((int)sizeof(X), (void**)&x); /* current code */ > /*11*/ allocate((int)sizeof(X), &x); /* as older gcc warned here already */ > /*12*/ return x; > /*13*/ } > /*14*/ > /*15*/ X* test2(void) > /*16*/ { > /*17*/ union { > /*18*/ X *x; > /*19*/ void* v; > /*20*/ } u; > /*21*/ allocate((int)sizeof(X), &u.v); > /*22*/ allocate((int)sizeof(X), (void**)&u); > /*23*/ return u.x; > /*24*/ } > $ gcc -Wall -O2 -c test.c -Wstrict-aliasing=2 > test.c: In function 'test1': > test.c:10: warning: dereferencing type-punned pointer will break strict-aliasing rules > test.c:11: warning: passing argument 2 of 'allocate' from incompatible pointer type > test.c: In function 'test2': > test.c:22: warning: dereferencing type-punned pointer might break strict-aliasing rules > > Strange is that line 10 "will", but line 22 "might" break > strict-aliasing rules. I don't see what's strange about it. Assigning to u.v and then converting the address of u to a void** is perfectly legal C. It's a pointless thing to do, though, and rather than this you might as well do Line 21. > Do I really need the union here like in test2() and line 21 ? There's no way for us to tell. > Or is there another "correct" way to get rid of warning in line 10 ? If you could tell us what you're really trying to do we might be able to help. The code in Line 10 makes no sense at all: it has no meaning, and can't possibly do anything useful. The sensible way to do what you need is simply: void *p; allocate((int)sizeof(X), &p); X *x = (x*)p; Andrew.