[systemd-devel] [PATCH] fix strict aliasing violations in src/udev/udev-builtin-usb_id.c

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Wed Mar 4 19:58:55 PST 2015


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".

[1] https://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Optimize-Options.html#index-fstrict_002daliasing-825

Zbyszek


More information about the systemd-devel mailing list