Christian BRUEL <christian.bruel@xxxxxx> writes: > From my understanding of the type-punning aliasing rule, the > following > code is correct, and indeed compiles fine with gcc/trunk : > > typedef struct { > short a : 16; > short b : 16; > } c; > > foo(c t1) > { > char *pt1 = (char*)&t1; > > if (*(int*)(pt1)) > return 0; > > return 1; > } No, this is not OK in C. The rule is that you may access a stored value only via a union, or a pointer to a compatible type, or a pointer to a character type. You You are (presumably) storing the value as short, and are accessing it as int. That is not OK. The rule is about how you access the value; passing the address of the value through a char * pointer does not sanitize it. gcc's aliasing warnings do their best but they are not intended to catch every erroneous case. > However if I try to rewrite it using an intermediate cast : > > foo(c t1) > { > if (*((int*)((char*)&t1))) > return 0; > > return 1; > } This isn't OK either. Ian