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 <m...@redhat.com> > --- > 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