This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/32641] New: C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- From: "ghazi at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 6 Jul 2007 06:58:44 -0000
- Subject: [Bug c/32641] New: C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
On solaris 10, the C99 macros fpclassify, isinf, isfinite and isnormal are
created for GCC by fixincludes. The resulting macros do not properly guard
against raising FP exceptions in various cases. Here are the current macro
definitions as created by fixincludes into iso/math_c99.h:
#undef fpclassify
#define fpclassify(x) \
__extension__ ({ __typeof(x) __x_fp = (x); \
isnan(__x_fp) \
? FP_NAN \
: isinf(__x_fp) \
? FP_INFINITE \
: isnormal(__x_fp) \
? FP_NORMAL \
: __x_fp == 0.0 \
? FP_ZERO \
: FP_SUBNORMAL; })
#undef isfinite
#define isfinite(x) \
__extension__ ({ __typeof (x) __x_f = (x); \
__builtin_expect(!isnan(__x_f - __x_f), 1); })
#undef isinf
#define isinf(x) \
__extension__ ({ __typeof (x) __x_i = (x); \
__builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); })
#undef isnan
#define isnan(x) __builtin_isnan(x)
#undef isnormal
#define isnormal(x) \
__extension__ ({ __typeof(x) __x_n = (x); \
if (__x_n < 0.0) __x_n = -__x_n; \
__builtin_expect(isfinite(__x_n) \
&& (sizeof(__x_n) == sizeof(float) \
? __x_n >= __FLT_MIN__ \
: sizeof(__x_n) == sizeof(long
double) \
? __x_n >= __LDBL_MIN__ \
: __x_n >= __DBL_MIN__), 1); })
Problems I've noted so far include:
1. The isfinite macro uses a subtraction. If supplied with inf, the inf-inf
expr results in a NaN, which raises an exception.
2. The isfinite macro is used in fpclassify and isinf, which can therefore
also raise exceptions.
3. The isnormal macro uses ordered comparisons, which raise exceptions when
supplied with NaN.
This occurs in 4.1.x, 4.2.x and mainline.
--
Summary: C99 fpclassify, isinf, isfinite, isnormal may raise FP
exceptions
Product: gcc
Version: 4.1.3
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: ghazi at gcc dot gnu dot org
GCC target triplet: sparc-sun-solaris2.10
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32641
- Follow-Ups:
- [Bug target/32641] C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- From: ghazi at gcc dot gnu dot org
- [Bug target/32641] C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- From: ghazi at gcc dot gnu dot org
- [Bug target/32641] C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- From: ghazi at gcc dot gnu dot org
- [Bug target/32641] C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- From: ghazi at gcc dot gnu dot org
- [Bug target/32641] C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- From: ghazi at gcc dot gnu dot org
- [Bug target/32641] C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- From: ghazi at gcc dot gnu dot org
- [Bug target/32641] C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions
- From: ghazi at gcc dot gnu dot org