summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2014-04-11 17:57:30 +0200
committerRich Felker <dalias@aerifal.cx>2014-04-16 02:46:05 -0400
commit67dc1f311646c50f3f1c281b7c345bb45401f17d (patch)
tree560c264c0731b725520baf2230805116bdf71db9
parent043865cadf1b26ee3a9ccdac3b0d0ca9d380cdad (diff)
downloadmusl-67dc1f311646c50f3f1c281b7c345bb45401f17d.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. (cherry picked from commit 73c870ed3209b68b5c8c350534508cc9d95a6bcb)
-rw-r--r--src/math/modfl.c7
-rw-r--r--src/math/sincosl.c5
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)