Skip site navigation (1)Skip section navigation (2)
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>