Skip to content

Commit

Permalink
Fix csin, csinh, ccos, ccosh missing underflows (bug 15405).
Browse files Browse the repository at this point in the history
  • Loading branch information
Joseph Myers committed Apr 26, 2013
1 parent aa630f5 commit f030294
Show file tree
Hide file tree
Showing 12 changed files with 148 additions and 1 deletion.
18 changes: 18 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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 ...
Expand Down
2 changes: 1 addition & 1 deletion NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
12 changes: 12 additions & 0 deletions math/libm-test.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

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

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

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

Expand Down
13 changes: 13 additions & 0 deletions math/s_ccosh.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 13 additions & 0 deletions math/s_ccoshf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 13 additions & 0 deletions math/s_ccoshl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 13 additions & 0 deletions math/s_csin.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 13 additions & 0 deletions math/s_csinf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 13 additions & 0 deletions math/s_csinh.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 13 additions & 0 deletions math/s_csinhf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 13 additions & 0 deletions math/s_csinhl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 13 additions & 0 deletions math/s_csinl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down

0 comments on commit f030294

Please sign in to comment.