From: Joseph Myers Date: Fri, 26 Apr 2013 19:25:19 +0000 (+0000) Subject: Fix csin, csinh, ccos, ccosh missing underflows (bug 15405). X-Git-Tag: glibc-2.18~369 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f0302940e7c2acb587971e3c99dfbd00aa4e2134;p=thirdparty%2Fglibc.git Fix csin, csinh, ccos, ccosh missing underflows (bug 15405). --- diff --git a/ChangeLog b/ChangeLog index 2900e14a646..1996e6c04a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2013-04-26 Joseph Myers + + [BZ #15405] + * math/s_ccosh.c (__ccosh): Ensure underflow exception occurs for + underflowed result. + * math/s_ccoshf.c (__ccoshf): Likewise. + * math/s_ccoshl.c (__ccoshl): Likewise. + * math/s_csin.c (__csin): Likewise. + * math/s_csinf.c (__csinf): Likewise. + * math/s_csinh.c (__csinh): Likewise. + * math/s_csinhf.c (__csinhf): Likewise. + * math/s_csinhl.c (__csinhl): Likewise. + * math/s_csinl.c (__csinl): Likewise. + * math/libm-test.inc (ccos_test): Add more tests. + (ccosh_test): Likewise. + (csin_test): Likewise. + (csinh_test): Likewise. + 2013-04-26 Adhemerval Zanella * sysdeps/powerpc/power5/fpu/s_modf.c: Moved to ... diff --git a/NEWS b/NEWS index c5b57a8c2ee..f986862b976 100644 --- a/NEWS +++ b/NEWS @@ -14,7 +14,7 @@ Version 2.18 14812, 14888, 14920, 14964, 14981, 14982, 14985, 14994, 14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078, 15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15305, 15307, 15309, 15327, - 15330, 15335, 15336, 15337, 15342, 15346, 15361, 15366, 15394. + 15330, 15335, 15336, 15337, 15342, 15346, 15361, 15366, 15394, 15405. * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla #15078). diff --git a/math/libm-test.inc b/math/libm-test.inc index eb9fa710cd8..a3d77315312 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -4570,6 +4570,9 @@ ccos_test (void) TEST_c_c (ccos, 0x1p-16434L, 22730, plus_infty, -1.217853148905605987081057582351152052687e4924L, OVERFLOW_EXCEPTION); #endif + TEST_c_c (ccos, min_subnorm_value * 0x1p120, 0x1p-120, 1.0, -min_subnorm_value, UNDERFLOW_EXCEPTION); + TEST_c_c (ccos, 0x1p-120, min_subnorm_value * 0x1p120, 1.0, -min_subnorm_value, UNDERFLOW_EXCEPTION); + END (ccos, complex); } @@ -4670,6 +4673,9 @@ ccosh_test (void) TEST_c_c (ccosh, 22730, 0x1p-16434L, plus_infty, 1.217853148905605987081057582351152052687e4924L, OVERFLOW_EXCEPTION); #endif + TEST_c_c (ccosh, min_subnorm_value * 0x1p120, 0x1p-120, 1.0, min_subnorm_value, UNDERFLOW_EXCEPTION); + TEST_c_c (ccosh, 0x1p-120, min_subnorm_value * 0x1p120, 1.0, min_subnorm_value, UNDERFLOW_EXCEPTION); + END (ccosh, complex); } @@ -5898,6 +5904,9 @@ csin_test (void) TEST_c_c (csin, 0x1p-16434L, 22730, 1.217853148905605987081057582351152052687e4924L, plus_infty, OVERFLOW_EXCEPTION); #endif + TEST_c_c (csin, min_subnorm_value, min_value, min_subnorm_value, min_value, UNDERFLOW_EXCEPTION); + TEST_c_c (csin, min_value, min_subnorm_value, min_value, min_subnorm_value, UNDERFLOW_EXCEPTION); + END (csin, complex); } @@ -5997,6 +6006,9 @@ csinh_test (void) TEST_c_c (csinh, 22730, 0x1p-16434L, plus_infty, 1.217853148905605987081057582351152052687e4924L, OVERFLOW_EXCEPTION); #endif + TEST_c_c (csinh, min_subnorm_value, min_value, min_subnorm_value, min_value, UNDERFLOW_EXCEPTION); + TEST_c_c (csinh, min_value, min_subnorm_value, min_value, min_subnorm_value, UNDERFLOW_EXCEPTION); + END (csinh, complex); } diff --git a/math/s_ccosh.c b/math/s_ccosh.c index 2c05b63de47..05b146ecbf6 100644 --- a/math/s_ccosh.c +++ b/math/s_ccosh.c @@ -82,6 +82,19 @@ __ccosh (__complex__ double x) __real__ retval = __ieee754_cosh (__real__ x) * cosix; __imag__ retval = __ieee754_sinh (__real__ x) * sinix; } + + if (fabs (__real__ retval) < DBL_MIN) + { + volatile double force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabs (__imag__ retval) < DBL_MIN) + { + volatile double force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else { diff --git a/math/s_ccoshf.c b/math/s_ccoshf.c index de7e7d302a4..62bf83c05bf 100644 --- a/math/s_ccoshf.c +++ b/math/s_ccoshf.c @@ -82,6 +82,19 @@ __ccoshf (__complex__ float x) __real__ retval = __ieee754_coshf (__real__ x) * cosix; __imag__ retval = __ieee754_sinhf (__real__ x) * sinix; } + + if (fabsf (__real__ retval) < FLT_MIN) + { + volatile float force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabsf (__imag__ retval) < FLT_MIN) + { + volatile float force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else { diff --git a/math/s_ccoshl.c b/math/s_ccoshl.c index 4bbd31148f8..18d3df04303 100644 --- a/math/s_ccoshl.c +++ b/math/s_ccoshl.c @@ -82,6 +82,19 @@ __ccoshl (__complex__ long double x) __real__ retval = __ieee754_coshl (__real__ x) * cosix; __imag__ retval = __ieee754_sinhl (__real__ x) * sinix; } + + if (fabsl (__real__ retval) < LDBL_MIN) + { + volatile long double force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabsl (__imag__ retval) < LDBL_MIN) + { + volatile long double force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else { diff --git a/math/s_csin.c b/math/s_csin.c index cc1c9cd7ab5..6d28e4c1b94 100644 --- a/math/s_csin.c +++ b/math/s_csin.c @@ -88,6 +88,19 @@ __csin (__complex__ double x) if (negate) __real__ retval = -__real__ retval; + + if (fabs (__real__ retval) < DBL_MIN) + { + volatile double force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabs (__imag__ retval) < DBL_MIN) + { + volatile double force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else { diff --git a/math/s_csinf.c b/math/s_csinf.c index 92b858ae6a7..a3dcf9d3aa3 100644 --- a/math/s_csinf.c +++ b/math/s_csinf.c @@ -88,6 +88,19 @@ __csinf (__complex__ float x) if (negate) __real__ retval = -__real__ retval; + + if (fabsf (__real__ retval) < FLT_MIN) + { + volatile float force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabsf (__imag__ retval) < FLT_MIN) + { + volatile float force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else { diff --git a/math/s_csinh.c b/math/s_csinh.c index be3c6bbb87a..5a98f67851b 100644 --- a/math/s_csinh.c +++ b/math/s_csinh.c @@ -88,6 +88,19 @@ __csinh (__complex__ double x) if (negate) __real__ retval = -__real__ retval; + + if (fabs (__real__ retval) < DBL_MIN) + { + volatile double force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabs (__imag__ retval) < DBL_MIN) + { + volatile double force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else { diff --git a/math/s_csinhf.c b/math/s_csinhf.c index 6c58c1d0d2b..3658805fcbd 100644 --- a/math/s_csinhf.c +++ b/math/s_csinhf.c @@ -88,6 +88,19 @@ __csinhf (__complex__ float x) if (negate) __real__ retval = -__real__ retval; + + if (fabsf (__real__ retval) < FLT_MIN) + { + volatile float force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabsf (__imag__ retval) < FLT_MIN) + { + volatile float force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else { diff --git a/math/s_csinhl.c b/math/s_csinhl.c index 8acf6dec52e..54a13fdda23 100644 --- a/math/s_csinhl.c +++ b/math/s_csinhl.c @@ -88,6 +88,19 @@ __csinhl (__complex__ long double x) if (negate) __real__ retval = -__real__ retval; + + if (fabsl (__real__ retval) < LDBL_MIN) + { + volatile long double force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabsl (__imag__ retval) < LDBL_MIN) + { + volatile long double force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else { diff --git a/math/s_csinl.c b/math/s_csinl.c index 6b3c1ea2f12..4d6ce3db356 100644 --- a/math/s_csinl.c +++ b/math/s_csinl.c @@ -88,6 +88,19 @@ __csinl (__complex__ long double x) if (negate) __real__ retval = -__real__ retval; + + if (fabsl (__real__ retval) < LDBL_MIN) + { + volatile long double force_underflow + = __real__ retval * __real__ retval; + (void) force_underflow; + } + if (fabsl (__imag__ retval) < LDBL_MIN) + { + volatile long double force_underflow + = __imag__ retval * __imag__ retval; + (void) force_underflow; + } } else {