about summary refs log tree commit diff
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2019-06-18 11:47:49 -0400
committerZack Weinberg <zackw@panix.com>2020-01-08 13:04:44 -0500
commitafaa4fe717db9f4106570665f5db0cd45684b96a (patch)
tree202ee1da168bf8b9c9a3209fa54d52fb8404d496
parent89cbc039a98f6bfc7e27c98a7e3799cf190c11f1 (diff)
downloadglibc-afaa4fe717db9f4106570665f5db0cd45684b96a.tar.gz
glibc-afaa4fe717db9f4106570665f5db0cd45684b96a.tar.xz
glibc-afaa4fe717db9f4106570665f5db0cd45684b96a.zip
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 <glob.h>
    #include <stddef.h>
    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.
-rw-r--r--conform/data/glob.h-data2
-rw-r--r--inet/netinet/igmp.h3
-rw-r--r--mach/lock-intern.h3
-rw-r--r--misc/ar.h2
-rw-r--r--misc/sys/auxv.h3
-rw-r--r--posix/glob.h33
-rw-r--r--resolv/resolv.h3
-rwxr-xr-xscripts/check-obsolete-constructs.py18
-rw-r--r--socket/sys/un.h2
-rw-r--r--sunrpc/rpc/auth_des.h3
-rw-r--r--sunrpc/rpc/rpc_msg.h2
-rw-r--r--sysdeps/generic/memcopy.h3
-rw-r--r--sysdeps/generic/netinet/tcp.h3
-rw-r--r--sysdeps/htl/pthread.h1
-rw-r--r--sysdeps/mach/hurd/net/ethernet.h3
-rw-r--r--sysdeps/mach/hurd/net/if_arp.h4
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 2c3f167946..3a5b157073 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 <sys/cdefs.h>
+#include <features.h>
+
 #include <sys/types.h>
 
 #ifdef __USE_MISC
diff --git a/mach/lock-intern.h b/mach/lock-intern.h
index b6a075bc3a..357860c836 100644
--- a/mach/lock-intern.h
+++ b/mach/lock-intern.h
@@ -18,7 +18,8 @@
 #ifndef _LOCK_INTERN_H
 #define	_LOCK_INTERN_H
 
-#include <sys/cdefs.h>
+#include <features.h>
+
 #if defined __USE_EXTERN_INLINES && defined _LIBC
 # include <lowlevellock.h>
 #endif
diff --git a/misc/ar.h b/misc/ar.h
index 85ecba604c..8dcef44a9d 100644
--- a/misc/ar.h
+++ b/misc/ar.h
@@ -19,7 +19,7 @@
 #ifndef _AR_H
 #define _AR_H 1
 
-#include <sys/cdefs.h>
+#include <features.h>
 
 /* 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 1a563e1337..038bbbe255 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 <features.h>
+
 #include <elf.h>
-#include <sys/cdefs.h>
 #include <bits/hwcap.h>
 
 __BEGIN_DECLS
diff --git a/posix/glob.h b/posix/glob.h
index b82a28286a..e647ba813a 100644
--- a/posix/glob.h
+++ b/posix/glob.h
@@ -18,21 +18,24 @@
 #ifndef	_GLOB_H
 #define	_GLOB_H	1
 
-#include <sys/cdefs.h>
+#include <features.h>
 
 __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 <stddef.h>
+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 a039a9e636..ce3922c3ed 100644
--- a/resolv/resolv.h
+++ b/resolv/resolv.h
@@ -52,7 +52,8 @@
 #ifndef _RESOLV_H_
 #define _RESOLV_H_
 
-#include <sys/cdefs.h>
+#include <features.h>
+
 #include <sys/param.h>
 #include <sys/types.h>
 #include <stdio.h>
diff --git a/scripts/check-obsolete-constructs.py b/scripts/check-obsolete-constructs.py
index 1d9eec5d0e..25c0d6868d 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 95400f78a5..8bc9c3adb8 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 <sys/cdefs.h>
+#include <features.h>
 
 /* Get the definition of the macro to define the common sockaddr members.  */
 #include <bits/sockaddr.h>
diff --git a/sunrpc/rpc/auth_des.h b/sunrpc/rpc/auth_des.h
index 79b49ad66a..f7437bb7f7 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 <sys/cdefs.h>
+#include <features.h>
+
 #include <rpc/auth.h>
 
 __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 <sys/cdefs.h>
+#include <features.h>
 
 #include <rpc/xdr.h>
 #include <rpc/clnt.h>
diff --git a/sysdeps/generic/memcopy.h b/sysdeps/generic/memcopy.h
index 0b09ca330c..a2d37a1cd8 100644
--- a/sysdeps/generic/memcopy.h
+++ b/sysdeps/generic/memcopy.h
@@ -20,6 +20,8 @@
 #ifndef _MEMCOPY_H
 #define _MEMCOPY_H	1
 
+#include <features.h>
+
 /* 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 <sys/cdefs.h>
 #include <endian.h>
 #include <pagecopy.h>
 
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 <sys/cdefs.h>
 
+#include <features.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/htl/pthread.h b/sysdeps/htl/pthread.h
index 3216860493..2f9d37707e 100644
--- a/sysdeps/htl/pthread.h
+++ b/sysdeps/htl/pthread.h
@@ -25,7 +25,6 @@
 
 #include <features.h>
 
-#include <sys/cdefs.h>
 #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 06beb6c9af..53b2e39600 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 <sys/cdefs.h>
+#include <features.h>
+
 #include <sys/types.h>
 #include <stdint.h>
 #include <net/if_ether.h>     /* IEEE 802.3 Ethernet constants */
diff --git a/sysdeps/mach/hurd/net/if_arp.h b/sysdeps/mach/hurd/net/if_arp.h
index 0fa9bcec9e..ffb6ef1e22 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 <sys/cdefs.h>
+
+#include <features.h>
 
 #include <sys/types.h>
 #include <sys/socket.h>