On 05/30/2011 01:33 PM, Thibault Castel wrote: >> ---------- Message transfÃrà ---------- >> From: Steffen Dettmer <steffen.dettmer@xxxxxxxxxxxxxx> >> To: gcc-help@xxxxxxxxxxx >> Date: Mon, 30 May 2011 13:59:51 +0200 >> Subject: Re: Weird strict-aliasing break >> On Mon, May 30, 2011 Thibault Castel <thibault.castel@xxxxxxxxx> wrote: >>> I have a weird warning when compiling my program with g++: >>> "dereferencing pointer âNAMEâ does break strict-aliasing rules" >>> >>> So, I tried to investigate a little bit and find some clues : I do a >>> memory mapping from a char buffer to a C struct to have access to >>> different datas into the buffer. Pretty casual. But, when I try to >>> access one of my inner field, the warning triggers... Huh... >> >> Beside that this may have other disadvantages, such as depending >> on byte order, padding and alighnment issues, in general you >> cannot assume that constructions like: >> >> struct s { >> int a; // or int32_t >> }; >> char buffer[]; >> >> struct s *p = buffer; p->a; >> struct s *p = buffer+1; p->a; >> >> this even may crash (we had such problems on some ARM CPUs). >> > > Yes, we have some ARM CPUs as targets but specific code (with such > aligment adaptations) are used. The code I provided is x86 targeted > only ;) > >> I think better here is using memcpy, but still "you have to know >> what you are doing". > > No, because I don't want to copy anything. I just need to access > fields for reading and extracting data. I don't write into it. It's > really just a memory mapping. You're still better off with memcpy. There's no loss of efficiency, and it'll be legal C++. Andrew.