Date: Sun, 2 Aug 2015 14:10:33 +1000 (EST) From: Bruce Evans <brde@optusnet.com.au> To: John-Mark Gurney <jmg@freebsd.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r286168 - head/sys/net Message-ID: <20150802133842.N894@besplex.bde.org> In-Reply-To: <201508020015.t720Fr6R018929@repo.freebsd.org> References: <201508020015.t720Fr6R018929@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 2 Aug 2015, John-Mark Gurney wrote: > Log: > convert to C11's _Static_assert, and pull in sys/cdefs.h for > compatibility w/ older non-C11 compilers... This include is bogus. <net/pfkeyv2.h> already depends on the includer including other headers that include <sys/cdefs.h>. Mainly <sys/types.h>. <sys/types.h> defined massive namespace pollution that includes everything in <sys/cdefs.h>. It includes <sys/cdefs.h> an infinite number of times via recursion, except the recursion is stopped by anti-reinclude guards. Th recursion makes the static number of nested includes of <sys/cdefs.h> hard to count. Also, this is a kernel header. All kernel headers depend on the includer including <sys/param.h> and <sys/systm.h>. Some work accidentally without this, and broken includers depend on this. For example, this file didn't depend on <sys/systm.h> for the definition of CTASSERT() and wasn't broken when CTASSERT() was added, but if any includers of it that didn't include <sys/systm.h> had there brokenness exposed. <sys/param.h> and <sys/systm.h> defined much more massive namespace pollution than <sys/types.h>, together with some names that that are not pollution. Almost everything in <sys/cdef.h> is now part of the API. As a result, most kernel headers should not include <sys/cdefs.h>. Some leaf headers like the x86 _types.h check that it is included before them. Some headers that are intentionally shared between the kernel and userland have a sloppy but non-polluting _KERNEL section that depends on many includes (mainly all the ones in <sys/param.h> and doesn't include anything explicitly, followed by a non-sloppy userland section that begins with an include of <sys/cdefs.h>. This include used to be used for __BEGIN/__END_DECLS and __P(()) but is now just used for the former. Macros like __BEGIN/__END_DECLS and _Static_assert are just as ugly as __P(()) and should go away, but they have proliferated faster than __P(()) went away. The non-sloppyness includes not including <sys/types.h> but using basic types and declaring the few ufoo_t types that are part of the documented API of the header. If an application wants to abuse a kernel header, then it must fake the kernel environment for it. I don't know much about this header, but it is not documented in any man page so it can do anything. Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150802133842.N894>