> > On 05/18/2016 07:14 AM, Christophe Fergeau wrote: > > On Wed, May 18, 2016 at 12:46:03PM +0300, Uri Lublin wrote: > >> > >> In man cmsg examples I see they use a pointer: > >> int *pi = (int*) CMSG_DATA(cmsg); > >> *fd = *pi; > > > > It seems to work this way, but I'm not sure why this works ;) > > > > > I read an excelent post from Thiago Macieira (Qt) about this types of > warnings a long time ago, maybe it will make things clearer for you too... > > http://blog.qt.io/blog/2011/06/10/type-punning-and-strict-aliasing/ > Actually there are some mistake in the article. Situation is sometimes better sometimes worst. In this int i = 42; short s = *(short*)&i; compiler could rewrite to something like int i; short s = *(short*)&i; i = 42; so s can be anything. short s[2] = { 0, 42 }; int i = *(int *)s; still here can be anything and the crash is not due to strict aliasing. I think the union is kind of a missing specification inside the standard but really should work. Also gcc has a may_alias attribute which should have been added to the standard (or similar specification). Considering that C was introduced to help with stuff like kernels it's a big omission. The inline of operator>> is a bug in the implementation, the standard clearly state that there are aliasing in that code (as char* and or similar pointers are used). The List* -> Node* cast is a programming mistake, the solution is using a Node** for the tail. This C code - happily - don't compile anymore: int i; char *p1, *p2; ... *i = i + p1 + p2; Linux Kernel and other software disable the strict aliasing. Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel