This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/32641] New: C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]