diff options
| author | Szabolcs Nagy <nsz@port70.net> | 2014-04-11 17:57:30 +0200 | 
|---|---|---|
| committer | Szabolcs Nagy <nsz@port70.net> | 2014-04-11 18:07:08 +0200 | 
| commit | 73c870ed3209b68b5c8c350534508cc9d95a6bcb (patch) | |
| tree | d2d59479ac1cb75e6ef6a8e707e7c0bb3b1ebb2d | |
| parent | 6fbdeff0e51f6afc38fbb1476a4db81322779da4 (diff) | |
| download | musl-73c870ed3209b68b5c8c350534508cc9d95a6bcb.tar.gz | |
math: fix aliasing violation in long double wrappers
modfl and sincosl were passing long double* instead of double*
to the wrapped double precision functions (on archs where long
double and double have the same size).
This is fixed now by using temporaries (this is not optimized
to a single branch so the generated code is a bit bigger).
Found by Morten Welinder.
| -rw-r--r-- | src/math/modfl.c | 7 | ||||
| -rw-r--r-- | src/math/sincosl.c | 5 | 
2 files changed, 10 insertions, 2 deletions
| diff --git a/src/math/modfl.c b/src/math/modfl.c index f736bba4..4b03a4be 100644 --- a/src/math/modfl.c +++ b/src/math/modfl.c @@ -3,7 +3,12 @@  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024  long double modfl(long double x, long double *iptr)  { -	return modf(x, (double *)iptr); +	double d; +	long double r; + +	r = modf(x, &d); +	*iptr = d; +	return r;  }  #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384  #if LDBL_MANT_DIG == 64 diff --git a/src/math/sincosl.c b/src/math/sincosl.c index 2c600801..d3ac1c4c 100644 --- a/src/math/sincosl.c +++ b/src/math/sincosl.c @@ -4,7 +4,10 @@  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024  void sincosl(long double x, long double *sin, long double *cos)  { -	sincos(x, (double *)sin, (double *)cos); +	double sind, cosd; +	sincos(x, &sind, &cosd); +	*sin = sind; +	*cos = cosd;  }  #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384  void sincosl(long double x, long double *sin, long double *cos) | 
