From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 792 invoked by alias); 16 May 2019 18:36:49 -0000 Mailing-List: contact glibc-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: , Sender: glibc-cvs-owner@sourceware.org List-Subscribe: Received: (qmail 775 invoked by uid 9014); 16 May 2019 18:36:49 -0000 Date: Thu, 16 May 2019 18:36:00 -0000 Message-ID: <20190516183649.774.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Zack Weinberg To: glibc-cvs@sourceware.org Subject: =?utf-8?q?=5Bglibc/zack/no-nested-includes=5D_Don=E2=80=99t_include_sys/c?= =?utf-8?q?defs=2Eh_directly_from_public_headers=2E?= X-Act-Checkin: glibc X-Git-Author: Zack Weinberg X-Git-Refname: refs/heads/zack/no-nested-includes X-Git-Oldrev: 4494336f9a613d6ff612eca0e353b2505f53f11d X-Git-Newrev: 7888495259cfb7b9a9334aa4f4c4846d6166340d X-SW-Source: 2019-q2/txt/msg00159.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=7888495259cfb7b9a9334aa4f4c4846d6166340d commit 7888495259cfb7b9a9334aa4f4c4846d6166340d Author: Zack Weinberg Date: Sat Mar 16 14:31:08 2019 -0400 Don’t include sys/cdefs.h directly from public headers. 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: Remove most whitelist entries for sys/cdefs.h. Diff: --- 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 | 17 +++++++---------- 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(+), 41 deletions(-) diff --git a/conform/data/glob.h-data b/conform/data/glob.h-data index eca8393..6268134 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 dccdb11..2f5be95 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 1988c89..a409abb 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 ef2303e..adcfda4 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 68363b3..404da6f 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 378b80a..e49e6c0 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 7a8023a..b4ef66f 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 c498f08..a06e986 100755 --- a/scripts/check-obsolete-constructs.py +++ b/scripts/check-obsolete-constructs.py @@ -526,11 +526,10 @@ 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" ], "poll.h": [ "sys/poll.h" ], - "pthread.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 +549,7 @@ HEADER_ALLOWED_INCLUDES = { "sys/time.h": [ "sys/select.h" ], "sys/types.h": [ "endian.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 +564,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" ], @@ -601,7 +599,7 @@ HEADER_ALLOWED_INCLUDES = { # Nonstandardized sys/ headers "sys/acct.h": [ "stdint.h", "sys/types.h" ], - "sys/auxv.h": [ "elf.h", "sys/cdefs.h" ], + "sys/auxv.h": [ "elf.h" ], "sys/bitypes.h": [ "sys/types.h" ], "sys/dir.h": [ "dirent.h" ], "sys/elf.h": [ "sys/procfs.h" ], @@ -644,15 +642,15 @@ 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" ], - "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", @@ -667,8 +665,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 1268360..8c7433a 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 245675f..e60e795 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 a2cc516..efd9ee4 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 e10d01e..de32e56 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 49f1bfb..3b59e94 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 a820551..158a095 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 4aa67ea..8956694 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 6ef93c9..9e1b223 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