Fix csin, csinh, ccos, ccosh missing underflows (bug 15405).

This commit is contained in:
Joseph Myers 2013-04-26 19:25:19 +00:00
parent aa630f590c
commit f0302940e7
12 changed files with 148 additions and 1 deletions

View File

@ -1,3 +1,21 @@
2013-04-26 Joseph Myers <joseph@codesourcery.com>
[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 <azanella@linux.vnet.ibm.com>
* sysdeps/powerpc/power5/fpu/s_modf.c: Moved to ...

2
NEWS
View File

@ -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).

View File

@ -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);
}

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{