[PATCH 06/13] Installed header hygiene (BZ#20366): Macros used in #if without checking whether they are defined.

Carlos O'Donell carlos@redhat.com
Wed Sep 21 18:02:00 GMT 2016


On 08/29/2016 09:16 PM, Zack Weinberg wrote:
> sysdeps/unix/sysv/linux/bits/socket.h wants to know whether __flexarr
> will produce a real flexible array member -- specifically, one that
> doesn't alter sizeof(the structure containing it).  Rather than make
> its approximation to that condition any more complicated, I added a
> new macro to sys/cdefs.h, __flexarr_is_fake, which reveals exactly
> what it wants to know.  I also took the opportunity to flatten the
> rather messy conditional nest defining __flexarr.
> 
> It seems to me that _LIBC should not appear in installed headers, but
> avoiding that for argp specifically would require more surgery than
> feels appropriate for this patch set.  It's possible that
> "#ifdef _LIBC" would be sufficient, but I wanted to be conservative.
> 
> 	* argp/argp.h: Check whether _LIBC is defined before expanding it.
>         * posix/glob.h: Check whether __USE_XOPEN2K8 is defined instead
>         of expanding it.
> 
>         * misc/sys/cdefs.h: Tidy up conditional nest defining __flexarr.
>         Define __flexarr_is_fake when the compiler does not support
>         flexible array members.
>         * sysdeps/unix/sysv/linux/bits/socket.h: Use __flexarr_is_fake
>         in definitions of struct cmsghdr and CMSG_DATA.

This patch fails to follow the Macro API best practice that all macros
be defined and that we should check for their values not their defined-ness
which can introduce subtle errors e.g. __flexarr_is_fake.

Please see:
https://sourceware.org/glibc/wiki/Wundef

At a high level I would expect _LIBC to always be defined as either 0 or 1.

-- 
Cheers,
Carlos.



More information about the Libc-alpha mailing list