On Wed, Mar 4, 2015 at 7:58 PM, Zbigniew Jędrzejewski-Szmek < zbys...@in.waw.pl> wrote:
> On Tue, Mar 03, 2015 at 04:21:30PM -0800, Shawn Landden wrote: > > also switch to <inttypes.h> > > --- > > src/udev/udev-builtin-usb_id.c | 35 ++++++++++++++++++----------------- > > 1 file changed, 18 insertions(+), 17 deletions(-) > > > > diff --git a/src/udev/udev-builtin-usb_id.c > b/src/udev/udev-builtin-usb_id.c > > index ab0d96e..0223421 100644 > > --- a/src/udev/udev-builtin-usb_id.c > > +++ b/src/udev/udev-builtin-usb_id.c > > @@ -28,6 +28,7 @@ > > #include <ctype.h> > > #include <fcntl.h> > > #include <errno.h> > > +#include <inttypes.h> > > > > #include "udev.h" > > > > @@ -153,15 +154,15 @@ static int dev_if_packed_info(struct udev_device > *dev, char *ifs_str, size_t len > > int pos = 0; > > unsigned strpos = 0; > > struct usb_interface_descriptor { > > - u_int8_t bLength; > > - u_int8_t bDescriptorType; > > - u_int8_t bInterfaceNumber; > > - u_int8_t bAlternateSetting; > > - u_int8_t bNumEndpoints; > > - u_int8_t bInterfaceClass; > > - u_int8_t bInterfaceSubClass; > > - u_int8_t bInterfaceProtocol; > > - u_int8_t iInterface; > > + uint8_t bLength; > > + uint8_t bDescriptorType; > > + uint8_t bInterfaceNumber; > > + uint8_t bAlternateSetting; > > + uint8_t bNumEndpoints; > > + uint8_t bInterfaceClass; > > + uint8_t bInterfaceSubClass; > > + uint8_t bInterfaceProtocol; > > + uint8_t iInterface; > > } __attribute__((packed)); > > > > if (asprintf(&filename, "%s/descriptors", > udev_device_get_syspath(dev)) < 0) > > @@ -179,21 +180,21 @@ static int dev_if_packed_info(struct udev_device > *dev, char *ifs_str, size_t len > > > > ifs_str[0] = '\0'; > > while (pos < size && strpos+7 < len-2) { > > - struct usb_interface_descriptor *desc; > > + struct usb_interface_descriptor desc; > > char if_str[8]; > > > > - desc = (struct usb_interface_descriptor *) &buf[pos]; > > - if (desc->bLength < 3) > > + memcpy(&desc, &buf[pos], sizeof(desc)); > Copying it seems suboptimal. But is this actually an aliasing > violation? buf is a char array, and [1] says: "a character type > may alias any other type". > > Common misunderstanding about strict aliasing. if accessing as char * yes, but not the other way around. See the C11 standard which makes it clear (don't have page number off the top of my head...) > [1] > https://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Optimize-Options.html#index-fstrict_002daliasing-825 > > Zbyszek > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel > -- Shawn Landden
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel