svn commit: r312119 - head/sys/kern

Bruce Evans brde at optusnet.com.au
Sun Jan 15 06:49:35 UTC 2017


On Sat, 14 Jan 2017, Ngie Cooper wrote:

> Log:
>  encode_long, encode_timeval: mechanically replace `exp` with `exponent`
>
>  This helps fix a -Wshadow issue with exp(3) with tests/sys/acct/acct_test,
>  which include math.h, which in turn defines exp(3)

But kern_acct.c doesn't include math.h.

This messes up the kernel sources to simplify abusing them in tests.

The bug was only in the sed script in the makefile that translates
kern_acct.c to convert.c.  It converts 'log(' to 'syslog(', but is missing
conversion of the exp identifier to sysexp.

> ==============================================================================
> --- head/sys/kern/kern_acct.c	Sat Jan 14 05:02:53 2017	(r312118)
> +++ head/sys/kern/kern_acct.c	Sat Jan 14 05:06:14 2017	(r312119)
> @@ -469,8 +469,8 @@ static uint32_t
> encode_timeval(struct timeval tv)
> {
> 	int log2_s;
> -	int val, exp;	/* Unnormalized value and exponent */
> -	int norm_exp;	/* Normalized exponent */
> +	int val, exponent;	/* Unnormalized value and exponent */
> +	int norm_exponent;	/* Normalized exponent */
> 	int shift;
>
> 	/*

Now the bug is also bad style in the kernel sources.  The regexp was too
simple and munged norm_exp too, but not the exp's in comments.  The
comments are more banal than before now that they don't even expand 'exp'
but just echo 'exponent'.

> ...
> -	return (((FLT_MAX_EXP - 1 + exp + norm_exp) << (FLT_MANT_DIG - 1)) |
> +	return (((FLT_MAX_EXP - 1 + exponent + norm_exponent) << (FLT_MANT_DIG - 1)) |
> 	    ((shift > 0 ? val << shift : val >> -shift) & MANT_MASK));

Here the expansion also broke the formatting.

The details of the abuse in the test program are that acct_test.c includes
math.h and then includes then convert.c which is nearly a copy of the kernel
source file.  This takes clean include files and not enabling warnings
about redundant declarations to have a chance of working.

I use a similar hack to test libm, and didn't have to mess up the sources
too much to make the translation not too hard.  Files have to be copied
just to make the include paths manageable, and to compile them all with
the same CFLAGS since this is a performance test.  The most complicated
parts are to avoid library functions because they might not match the
sources or were compiled with different CFLAGS.  The sources are not well
organized well enough for my preferred method of "cc ${CLAGS} *.c" to work.

Bruce


More information about the svn-src-all mailing list