svn commit: r209842 - head/lib/libstand

Bruce Evans brde at optusnet.com.au
Sat Jul 10 13:32:45 UTC 2010


On Fri, 9 Jul 2010, Jung-uk Kim wrote:

> Log:
>  Fix build by defining MAX() macro here.
>
> Modified:
>  head/lib/libstand/printf.c

Arrgh.  The unsafe macros MAX() and MIN() were deprecated in the kernel,
but this has been broken (in 2001 for NetBSD and 2003 for FreeBSD).
Use of MAX() in kern/subr_prf.c was a style bug.  Older code in
subr_prf.c still uses the min()/max() family of inline functions (just
1 instance).

> Modified: head/lib/libstand/printf.c
> ==============================================================================
> --- head/lib/libstand/printf.c	Fri Jul  9 00:38:00 2010	(r209841)
> +++ head/lib/libstand/printf.c	Fri Jul  9 05:25:14 2010	(r209842)

Use of MAX() here was more than a style bug, since MAX() didn't exist.
libstand seems to have a full min()/max() family, modulo the usual bugs
and some bitrot (libkern never had uqmax()/min(), ...; libstand is missing
the addition of omax()/min(), which is unimportant since it doesn't use them,
but OTOH it doesn't use most of the ones that it has).

> @@ -151,6 +151,7 @@ ksprintn(char *nbuf, uintmax_t num, int
> static int
> kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap)
> {
> +#define	MAX(a, b) (((a) > (b)) ? (a) : (b))

One reason FreeBSD brought back the MAX() and MIN() mistakes was that
definitions like the above were duplicated in many places in code not
following normal kernel APIs.

> #define PCHAR(c) {int cc=(c); if (func) (*func)(cc); else *d++ = cc; retval++; }
> 	char nbuf[MAXNBUF];
> 	char *d;
>

The max() and min() families are hard to use because using them requires
knowing the types of the arg.

It is possible to write safe type-generic macros for max() and min() using
gcc features (mainly __typeof()).  gcc info gives examples of these.  I
didn't want to unportabilize the kernel by committing my versions of these,
but once used them to find some type mismatches in the misuse of the
max()/min() family.

The type-generic versions should be safe macros named max() and min(), but
unfortunately these good names are taken for the old API.

Bruce


More information about the svn-src-head mailing list