Bug 6794 - ilogb() does not raise exceptions or set errno on domain errors
Summary: ilogb() does not raise exceptions or set errno on domain errors
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: math (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-07-31 09:45 UTC by Michael Kerrisk
Modified: 2014-07-04 05:45 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments
test program (2.71 KB, text/plain)
2008-07-31 09:48 UTC, Michael Kerrisk
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Kerrisk 2008-07-31 09:45:41 UTC
The POSIX.1 specification of ilogb() says:

==
Domain Error
    The x argument is zero, NaN, or ±Inf, or the correct value is not
representable as an integer.

    If the integer expression (math_errhandling & MATH_ERRNO) is non-zero, then
errno shall be set to [EDOM]. If the integer expression (math_errhandling &
MATH_ERREXCEPT) is non-zero, then the invalid floating-point exception shall be
raised
==

However, in all of the above cases, errno is not set on error, and in some of
the cases, no exceptions is raised.  In all cases errno should be set to EDOM
and an FE_INVALID exception should be raised.


Background: 
On error, many glibc math functions both set errno and raise an exception
(fetestexcept(3)).  For example, the following  function all do this: acos(),
asin(), cosh(), sinh(), acosh(), asinh(), exp(), exp2(), ldexp(), log(),
log10(), log2().  However, there is much inconsistency.  Some functions raise an
exception, but don't set errno.  Some functions set errno for some errors, but
not others.  A few set errno, but don't raise an exception.  This series of bug
reports documents deviations from what I consider the ideal: all functions
should BOTH set errno AND raise an exception for all errors.

All of these reports relate to tests on glibc 2.8 (as provided by SUSE 11.0).
Comment 1 Michael Kerrisk 2008-07-31 09:48:02 UTC
Created attachment 2856 [details]
test program

Sample runs demonstrating problem.  In no case is errno set.  For the Inf and
-Inf cases, no exception is raised.

$ /tmp/mt_ilogb 0
errno == 0
fetestexcept() says:  FE_INVALID FE_DIVBYZERO
ilogb(0.00000000000000000e+00)=-2147483648
0 FE_DIVBYZERO normal

$ /tmp/mt_ilogb nan
errno == 0
fetestexcept() says:  FE_INVALID
ilogb(nan)=-2147483648
0 FE_INVALID normal

$ /tmp/mt_ilogb inf
errno == 0
fetestexcept() says:
ilogb(inf)=2147483647
0 0 normal

$ /tmp/mt_ilogb -- -inf
errno == 0
fetestexcept() says:
ilogb(-inf)=2147483647
0 0 normal
Comment 2 Michael Kerrisk 2008-07-31 09:50:57 UTC
Also, it is worth noting that log(), log2(), log10() do set errno and raise an
exception for the 0 and --inf cases.
Comment 3 Joseph Myers 2012-03-01 02:25:35 UTC
Confirmed with current sources on x86.  On x86_64, none of these cases raise exceptions or set errno at all (whereas on x86 some at least do raise exceptions).
Comment 4 Andreas Jaeger 2012-04-17 20:14:59 UTC
Thanks for the report, this is fixed now in glibc for glibc 2.16 thanks to Adhemerval Zanella .