[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 4/4] ARRAY_SIZE: check that argument is an ar
From: |
Eric Blake |
Subject: |
Re: [Qemu-devel] [PATCH v2 4/4] ARRAY_SIZE: check that argument is an array |
Date: |
Thu, 19 Jan 2017 08:53:34 -0600 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 |
On 01/18/2017 02:55 PM, Michael S. Tsirkin wrote:
> It's a familiar pattern: some code uses ARRAY_SIZE, then refactoring
> changes the argument from an array to a pointer to a dynamically
> allocated buffer. Code keeps compiling but any ARRAY_SIZE calls now
> return the size of the pointer divided by element size.
>
> Let's add build time checks to ARRAY_SIZE before we allow more
> of these in the code-base.
>
> Signed-off-by: Michael S. Tsirkin <address@hidden>
> ---
> include/qemu/osdep.h | 8 +++++++-
>
> #ifndef ARRAY_SIZE
> -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
> +/*
> + * &(x)[0] is always a pointer - if it's same type as x then the argument is
> a
> + * pointer, not an array as expected.
> + */
> +#define ARRAY_SIZE(x) ((sizeof(x) / sizeof((x)[0])) +
> QEMU_BUILD_BUG_ON_ZERO( \
> + __builtin_types_compatible_p(typeof(x), \
Are we sure that __builtin_types_compatible_p() is supported for all
versions of gcc and clang that we support, or does this need further
#ifdefs?
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
- Re: [Qemu-devel] [PATCH v2 2/4] compiler: drop ; after BUILD_BUG_ON, (continued)
Re: [Qemu-devel] [PATCH v2 2/4] compiler: drop ; after BUILD_BUG_ON, Markus Armbruster, 2017/01/19
[Qemu-devel] [PATCH v2 3/4] compiler: expression version of QEMU_BUILD_BUG_ON, Michael S. Tsirkin, 2017/01/18
[Qemu-devel] [PATCH v2 4/4] ARRAY_SIZE: check that argument is an array, Michael S. Tsirkin, 2017/01/18
Re: [Qemu-devel] [PATCH v2 0/4] virtio: ARRAY_SIZE fixups, no-reply, 2017/01/18