[systemd-devel] [PATCH] fix strict aliasing violations in src/udev/udev-builtin-usb_id.c
Lennart Poettering
lennart at poettering.net
Sun Mar 8 16:11:51 PDT 2015
On Thu, 05.03.15 04:58, Zbigniew Jędrzejewski-Szmek (zbyszek at in.waw.pl) wrote:
> > + 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".
>
> [1] https://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Optimize-Options.html#index-fstrict_002daliasing-825
Also, I greatly prefer using unions for these things, to make the
aliasing explicit, rather than copying things.
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list