math: fix aliasing violation in long double wrappers
authorSzabolcs Nagy <nsz@port70.net>
Fri, 11 Apr 2014 15:57:30 +0000 (17:57 +0200)
committerSzabolcs Nagy <nsz@port70.net>
Fri, 11 Apr 2014 16:07:08 +0000 (18:07 +0200)
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.

src/math/modfl.c
src/math/sincosl.c

index f736bba4d95cc017bae7f65078b9f3a8c1ecd9a4..4b03a4be0aa462b915c9ad5c85144771a706fcdc 100644 (file)
@@ -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
index 2c600801cbd0c81d69e6ea25f1e7e1345d5dcdb1..d3ac1c4c8c29e11067d55a3a99fa82eb888c5dd5 100644 (file)
@@ -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)