From patchwork Wed Jun 26 17:50:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Zack Weinberg X-Patchwork-Id: 33428 Received: (qmail 12040 invoked by alias); 26 Jun 2019 17:50:38 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 11939 invoked by uid 89); 26 Jun 2019 17:50:37 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-16.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.1 spammy=persuade X-HELO: l2mail1.panix.com From: Zack Weinberg To: libc-alpha@sourceware.org Cc: joseph@codesourcery.com, carlos@redhat.com Subject: [PATCH 12/25] =?UTF-8?q?Don=E2=80=99t=20include=20sys/cdefs.h=20d?= =?UTF-8?q?irectly=20from=20public=20headers.?= Date: Wed, 26 Jun 2019 13:50:16 -0400 Message-Id: <20190626175029.4699-3-zackw@panix.com> In-Reply-To: <20190626175029.4699-1-zackw@panix.com> References: <20190626175029.4699-1-zackw@panix.com> MIME-Version: 1.0 The convention throughout glibc is that every public header includes features.h directly, as its first action, and relies on features.h to include sys/cdefs.h. In a few places, though, it’s been done the other way around, usually in headers that were copied from a BSD source (where the convention is exactly the opposite). This patch makes all installed headers match the glibc convention. This patch also corrects a bug in glob.h: it may declare size_t without notifying stddef.h that it has done this, so e.g. #define _XOPEN_SOURCE 700 #include #include int dummy; declares size_t twice, which is invalid prior to C2011. I wasn’t able to persuade gcc 8 to issue an error, even with -std=c89 -Wsystem-headers, but clang is not so lenient. * posix/glob.h: Include features.h, not sys/cdefs.h. When __USE_XOPEN || USE_XOPEN2K8, include stddef.h for size_t; otherwise, issue an immediate #error if __SIZE_TYPE__ is not available. Use __gsize_t, not __size_t, as an impl-namespace alternative name for size_t. * conform/data/glob.h-data: Adjust to match. * inet/netinet/igmp.h, mach/lock-intern.h, misc/ar.h * misc/sys/auxv.h, resolv/resolv.h, socket/sys/un.h * sunrpc/rpc/auth_des.h, sunrpc/rpc/rpc_msg.h * sysdeps/generic/memcopy.h, sysdeps/generic/netinet/tcp.h * sysdeps/htl/pthread.h, sysdeps/mach/hurd/net/ethernet.h * sysdeps/mach/hurd/net/if_arp.h: Include features.h, not sys/cdefs.h. * scripts/check-obsolete-constructs.py (HEADER_ALLOWED_INCLUDES): Update. --- conform/data/glob.h-data | 2 +- inet/netinet/igmp.h | 3 ++- mach/lock-intern.h | 3 ++- misc/ar.h | 2 +- misc/sys/auxv.h | 3 ++- posix/glob.h | 33 +++++++++++++++------------- resolv/resolv.h | 3 ++- scripts/check-obsolete-constructs.py | 18 ++++++--------- socket/sys/un.h | 2 +- sunrpc/rpc/auth_des.h | 3 ++- sunrpc/rpc/rpc_msg.h | 2 +- sysdeps/generic/memcopy.h | 3 ++- sysdeps/generic/netinet/tcp.h | 3 +-- sysdeps/htl/pthread.h | 1 - sysdeps/mach/hurd/net/ethernet.h | 3 ++- sysdeps/mach/hurd/net/if_arp.h | 4 ++-- 16 files changed, 46 insertions(+), 42 deletions(-) diff --git a/conform/data/glob.h-data b/conform/data/glob.h-data index eca83937af..6268134b35 100644 --- a/conform/data/glob.h-data +++ b/conform/data/glob.h-data @@ -1,6 +1,6 @@ #if !defined ISO && !defined ISO99 && !defined ISO11 #ifdef POSIX -# define size_t __size_t +# define size_t __gsize_t #endif type glob_t diff --git a/inet/netinet/igmp.h b/inet/netinet/igmp.h index 451b1abf47..2884db59df 100644 --- a/inet/netinet/igmp.h +++ b/inet/netinet/igmp.h @@ -18,7 +18,8 @@ #ifndef _NETINET_IGMP_H #define _NETINET_IGMP_H 1 -#include +#include + #include #ifdef __USE_MISC diff --git a/mach/lock-intern.h b/mach/lock-intern.h index 1988c89b09..a409abbe62 100644 --- a/mach/lock-intern.h +++ b/mach/lock-intern.h @@ -18,7 +18,8 @@ #ifndef _LOCK_INTERN_H #define _LOCK_INTERN_H -#include +#include + #if defined __USE_EXTERN_INLINES && defined _LIBC # include #endif diff --git a/misc/ar.h b/misc/ar.h index ef2303ecfe..adcfda47e2 100644 --- a/misc/ar.h +++ b/misc/ar.h @@ -19,7 +19,7 @@ #ifndef _AR_H #define _AR_H 1 -#include +#include /* Archive files start with the ARMAG identifying string. Then follows a `struct ar_hdr', and as many bytes of member file data as its `ar_size' diff --git a/misc/sys/auxv.h b/misc/sys/auxv.h index 68363b364d..404da6f400 100644 --- a/misc/sys/auxv.h +++ b/misc/sys/auxv.h @@ -19,8 +19,9 @@ #ifndef _SYS_AUXV_H #define _SYS_AUXV_H 1 +#include + #include -#include #include __BEGIN_DECLS diff --git a/posix/glob.h b/posix/glob.h index 378b80af8f..e49e6c000d 100644 --- a/posix/glob.h +++ b/posix/glob.h @@ -18,21 +18,24 @@ #ifndef _GLOB_H #define _GLOB_H 1 -#include +#include __BEGIN_DECLS -/* We need `size_t' for the following definitions. */ -#ifndef __size_t -typedef __SIZE_TYPE__ __size_t; -# if defined __USE_XOPEN || defined __USE_XOPEN2K8 -typedef __SIZE_TYPE__ size_t; -# endif +/* Structures below have size_t fields, but this header is not supposed to + define size_t itself, unless XSI or POSIX.1-2008 features are active. + We can't use __size_t as an alternative name, as we do for most types + with this kind of constraint, because GCC's stddef.h uses __size_t for + a different purpose. */ + +#if defined __USE_XOPEN || defined __USE_XOPEN2K8 +# define __need_size_t +# include +typedef size_t __gsize_t; +#elif defined __SIZE_TYPE__ +typedef __SIZE_TYPE__ __gsize_t; #else -/* The GNU CC stddef.h version defines __size_t as empty. We need a real - definition. */ -# undef __size_t -# define __size_t size_t +# error "Don't know how to define __gsize_t" #endif /* Bits set in the FLAGS argument to `glob'. */ @@ -81,9 +84,9 @@ struct stat; #endif typedef struct { - __size_t gl_pathc; /* Count of paths matched by the pattern. */ + __gsize_t gl_pathc; /* Count of paths matched by the pattern. */ char **gl_pathv; /* List of matched pathnames. */ - __size_t gl_offs; /* Slots to reserve in `gl_pathv'. */ + __gsize_t gl_offs; /* Slots to reserve in `gl_pathv'. */ int gl_flags; /* Set to FLAGS, maybe | GLOB_MAGCHAR. */ /* If the GLOB_ALTDIRFUNC flag is set, the following functions @@ -110,9 +113,9 @@ struct stat64; # endif typedef struct { - __size_t gl_pathc; + __gsize_t gl_pathc; char **gl_pathv; - __size_t gl_offs; + __gsize_t gl_offs; int gl_flags; /* If the GLOB_ALTDIRFUNC flag is set, the following functions diff --git a/resolv/resolv.h b/resolv/resolv.h index 7a8023ae9d..b4ef66fdfa 100644 --- a/resolv/resolv.h +++ b/resolv/resolv.h @@ -52,7 +52,8 @@ #ifndef _RESOLV_H_ #define _RESOLV_H_ -#include +#include + #include #include #include diff --git a/scripts/check-obsolete-constructs.py b/scripts/check-obsolete-constructs.py index 08534348d7..e383a304db 100755 --- a/scripts/check-obsolete-constructs.py +++ b/scripts/check-obsolete-constructs.py @@ -527,11 +527,9 @@ HEADER_ALLOWED_INCLUDES = { # spawn.h -> sched.h "aio.h": [ "sys/types.h" ], "ftw.h": [ "sys/stat.h", "sys/types.h" ], - "glob.h": [ "sys/cdefs.h" ], "langinfo.h": [ "nl_types.h" ], "mqueue.h": [ "fcntl.h", "sys/types.h" ], - "pthread.h": [ "endian.h", "sched.h", "time.h", - "sys/cdefs.h" ], + "pthread.h": [ "sched.h", "time.h" ], "regex.h": [ "limits.h", "sys/types.h" ], "sched.h": [ "time.h" ], "semaphore.h": [ "sys/types.h" ], @@ -550,7 +548,7 @@ HEADER_ALLOWED_INCLUDES = { "sys/time.h": [ "sys/select.h" ], "sys/types.h": [ "endian.h", "sys/select.h" ], "sys/uio.h": [ "sys/types.h" ], - "sys/un.h": [ "string.h", "sys/cdefs.h" ], + "sys/un.h": [ "string.h" ], "sys/wait.h": [ "signal.h" ], # POSIX networking headers @@ -565,7 +563,6 @@ HEADER_ALLOWED_INCLUDES = { # Nonstandardized top-level headers "aliases.h": [ "sys/types.h" ], - "ar.h": [ "sys/cdefs.h" ], "argp.h": [ "ctype.h", "errno.h", "getopt.h", "limits.h", "stdio.h" ], "argz.h": [ "errno.h", "string.h" ], @@ -594,7 +591,7 @@ HEADER_ALLOWED_INCLUDES = { # Nonstandardized sys/ headers "sys/acct.h": [ "endian.h", "stdint.h", "sys/types.h" ], - "sys/auxv.h": [ "elf.h", "sys/cdefs.h" ], + "sys/auxv.h": [ "elf.h" ], "sys/elf.h": [ "sys/procfs.h" ], "sys/epoll.h": [ "stdint.h", "sys/types.h" ], "sys/eventfd.h": [ "stdint.h" ], @@ -649,16 +646,16 @@ HEADER_ALLOWED_INCLUDES = { # Nonstandardized networking headers "ifaddrs.h": [ "sys/socket.h" ], "resolv.h": [ "arpa/nameser.h", "netinet/in.h", - "stdio.h", "sys/cdefs.h", "sys/param.h",\ + "stdio.h", "sys/param.h", "sys/types.h" ], "arpa/nameser.h": [ "arpa/nameser_compat.h", "stdint.h", "sys/param.h", "sys/types.h" ], "arpa/nameser_compat.h": [ "endian.h" ], - "net/ethernet.h": [ "stdint.h", "sys/types.h", "sys/cdefs.h", + "net/ethernet.h": [ "stdint.h", "sys/types.h", "net/if_ether.h" ], "net/if_arp.h": [ "stdint.h", "sys/socket.h", - "sys/types.h", "sys/cdefs.h" ], + "sys/types.h" ], "net/if_ppp.h": [ "net/if.h", "net/ppp_defs.h", "stdint.h", "sys/ioctl.h", "sys/types.h" ], "net/if_shaper.h": [ "net/if.h", "stdint.h", "sys/ioctl.h", @@ -673,8 +670,7 @@ HEADER_ALLOWED_INCLUDES = { "sys/types.h", "stdint.h" ], "netinet/if_fddi.h": [ "stdint.h", "sys/types.h" ], "netinet/if_tr.h": [ "stdint.h", "sys/types.h" ], - "netinet/igmp.h": [ "netinet/in.h", "sys/cdefs.h", - "sys/types.h" ], + "netinet/igmp.h": [ "netinet/in.h", "sys/types.h" ], "netinet/in_systm.h": [ "stdint.h", "sys/types.h" ], "netinet/ip.h": [ "netinet/in.h", "sys/types.h" ], "netinet/ip6.h": [ "inttypes.h", "netinet/in.h" ], diff --git a/socket/sys/un.h b/socket/sys/un.h index 12683607ce..8c7433a3dc 100644 --- a/socket/sys/un.h +++ b/socket/sys/un.h @@ -18,7 +18,7 @@ #ifndef _SYS_UN_H #define _SYS_UN_H 1 -#include +#include /* Get the definition of the macro to define the common sockaddr members. */ #include diff --git a/sunrpc/rpc/auth_des.h b/sunrpc/rpc/auth_des.h index 245675ff51..e60e795cad 100644 --- a/sunrpc/rpc/auth_des.h +++ b/sunrpc/rpc/auth_des.h @@ -18,7 +18,8 @@ #ifndef _RPC_AUTH_DES_H #define _RPC_AUTH_DES_H 1 -#include +#include + #include __BEGIN_DECLS diff --git a/sunrpc/rpc/rpc_msg.h b/sunrpc/rpc/rpc_msg.h index a2cc516cd6..efd9ee4a2f 100644 --- a/sunrpc/rpc/rpc_msg.h +++ b/sunrpc/rpc/rpc_msg.h @@ -35,7 +35,7 @@ #ifndef _RPC_MSG_H #define _RPC_MSG_H 1 -#include +#include #include #include diff --git a/sysdeps/generic/memcopy.h b/sysdeps/generic/memcopy.h index e10d01ea08..de32e56f1a 100644 --- a/sysdeps/generic/memcopy.h +++ b/sysdeps/generic/memcopy.h @@ -20,6 +20,8 @@ #ifndef _MEMCOPY_H #define _MEMCOPY_H 1 +#include + /* The strategy of the memory functions is: 1. Copy bytes until the destination pointer is aligned. @@ -38,7 +40,6 @@ exhaustive in the sense that I tried all alignment and length combinations, with and without overlap. */ -#include #include #include diff --git a/sysdeps/generic/netinet/tcp.h b/sysdeps/generic/netinet/tcp.h index 49f1bfbc26..3b59e949d8 100644 --- a/sysdeps/generic/netinet/tcp.h +++ b/sysdeps/generic/netinet/tcp.h @@ -30,10 +30,9 @@ */ #ifndef _NETINET_TCP_H - #define _NETINET_TCP_H 1 -#include +#include __BEGIN_DECLS diff --git a/sysdeps/htl/pthread.h b/sysdeps/htl/pthread.h index a8205519f2..158a095417 100644 --- a/sysdeps/htl/pthread.h +++ b/sysdeps/htl/pthread.h @@ -25,7 +25,6 @@ #include -#include #ifndef __extern_inline /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 inline semantics, unless -fgnu89-inline is used. */ diff --git a/sysdeps/mach/hurd/net/ethernet.h b/sysdeps/mach/hurd/net/ethernet.h index 4aa67ea347..8956694b59 100644 --- a/sysdeps/mach/hurd/net/ethernet.h +++ b/sysdeps/mach/hurd/net/ethernet.h @@ -21,7 +21,8 @@ #ifndef __NET_ETHERNET_H #define __NET_ETHERNET_H 1 -#include +#include + #include #include #include /* IEEE 802.3 Ethernet constants */ diff --git a/sysdeps/mach/hurd/net/if_arp.h b/sysdeps/mach/hurd/net/if_arp.h index 6ef93c96dd..9e1b2233ce 100644 --- a/sysdeps/mach/hurd/net/if_arp.h +++ b/sysdeps/mach/hurd/net/if_arp.h @@ -20,9 +20,9 @@ /* Based on the 4.4BSD and Linux version of this file. */ #ifndef _NET_IF_ARP_H - #define _NET_IF_ARP_H 1 -#include + +#include #include #include