strtold does not set errno when it should

Bruno Haible bruno@clisp.org
Thu Dec 12 07:37:00 GMT 2019


POSIX [1] makes it clear that when the value to be returned would cause
underflow, it should set errno to ERANGE.

[1] <https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtod.html>

This test case fails with error code 4 on Cygwin 2.9.

========================== foo.c ==========================
#include <stdlib.h>
#include <errno.h>
#include <float.h>
#include <math.h>

int main ()
{
  const char input[] = "1E-100000";
  char *ptr;
  long double result;
  errno = 0;
  result = strtold (input, &ptr);
  if (!(ptr == input + 9))
    return 1;
  if (!(0.0L <= result && result <= LDBL_MIN))
    return 2;
  if (signbit (result))
    return 3;
  if (result == 0.0L && errno != ERANGE)
    return 4;
  return 0;
}
============================================================
$ gcc -Wall foo.c
$ ./a.exe
$ echo $?
4

The corresponding test case for strtod() / 'double' succeeds.

Bruno


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list