Bug 6797

Summary: lround() and llround() do not set errno on domain error
Product: glibc Reporter: Michael Kerrisk <mtk.manpages>
Component: mathAssignee: Not yet assigned to anyone <unassigned>
Status: NEW ---    
Severity: normal CC: glibc-bugs
Priority: P2 Flags: fweimer: security-
Version: unspecified   
Target Milestone: ---   
Host: Target:
Build: Last reconfirmed:
Attachments: test program
test program

Description Michael Kerrisk 2008-07-31 10:12:32 UTC
On a domain error, lround() and llround() correctly raise an exception, but do
not set errno.  They should set errno to EDOM.

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 10:13:11 UTC
Created attachment 2859 [details]
test program
Comment 2 Michael Kerrisk 2008-07-31 10:14:13 UTC
Created attachment 2860 [details]
test program

Sample runs demonstrating the problem:

$ /tmp/mt_lround inf
errno == 0
fetestexcept() says:  FE_INVALID
0 FE_INVALID normal

$ /tmp/mt_llround inf
errno == 0
fetestexcept() says:  FE_INVALID
0 FE_INVALID normal

$ /tmp/mt_lround nan
errno == 0
fetestexcept() says:  FE_INVALID
0 FE_INVALID normal

$ /tmp/mt_llround nan
errno == 0
fetestexcept() says:  FE_INVALID
0 FE_INVALID normal
Comment 3 Michael Kerrisk 2008-07-31 10:17:22 UTC
See also http://sourceware.org/bugzilla/show_bug.cgi?id=6798
Comment 4 Joseph Myers 2012-03-01 16:40:51 UTC
Confirmed with current sources on x86 and x86_64.