Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Aug 2018 10:25:50 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Mark Johnston <markj@freebsd.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org,  svn-src-head@freebsd.org
Subject:   Re: svn commit: r337426 - head/sbin/ifconfig
Message-ID:  <20180810092251.K1276@besplex.bde.org>
In-Reply-To: <201808071725.w77HPciT051597@repo.freebsd.org>
References:  <201808071725.w77HPciT051597@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 7 Aug 2018, Mark Johnston wrote:

> Log:
>  ifconfig: Fix use of _Noreturn.
>
>  The _Noreturn is a function-specifier (like inline) which must preceed
>  the declarator.
>
>  Submitted by:	Sebastian Huber <sebastian.huber@embedded-brains.de>
>  MFC after:	1 week

_Noreturn is even more broken than I knew.  It should never be used.  Here
its use is wronger than usual.

> Modified: head/sbin/ifconfig/ifconfig.c
> ==============================================================================
> --- head/sbin/ifconfig/ifconfig.c	Tue Aug  7 17:13:42 2018	(r337425)
> +++ head/sbin/ifconfig/ifconfig.c	Tue Aug  7 17:25:38 2018	(r337426)
> @@ -109,7 +109,7 @@ static	int ifconfig(int argc, char *const *argv, int i
> static	void status(const struct afswtch *afp, const struct sockaddr_dl *sdl,
> 		struct ifaddrs *ifa);
> static	void tunnel_status(int s);
> -static	void usage(void) _Noreturn;
> +static _Noreturn void usage(void);
>
> static struct afswtch *af_getbyname(const char *name);
> static struct afswtch *af_getbyfamily(int af);

FreeBSD code should use __dead2 since it is more portable (within
FreeBSD) and doesn't have so mean syntactical restrictions.  However,
it only exists at all since it had similar syntactial restrictions
when it was new (FreeBSD-1 used __dead, which must be placed like
_Noreturn, but __dead2 uses __attribute__(()) which couldn't be placed
there when it was new), and the macro that hides the details was renamed
to inhibit misuse.  Changing __dead2 to _Noreturn and moving it to satisfy
the restricted syntax of the latter mainly broke support for old compilers
where __dead2 cannot be placed there.

However, all declarations of static usage() as non-returning are bogus, and
this one is more bogus than most since another style bug is to unsort
usage() to before where it is used, so even 1-pass compilers can see that
it doesn't return before generating code that uses it.  Unsorting of inline
functions is sometimes needed so that 1-pass compilers can optimize them,
but optimizing usage() is especially not needed.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20180810092251.K1276>