On Thu, Jan 19, 2017 at 08:53:34AM -0600, Eric Blake wrote: > 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 >
We seem to use it without ifdefs elsewhere. -- MST