Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Jan 2002 16:29:24 -0700
From:      Chad David <davidc@acns.ab.ca>
To:        "Brian F. Feldman" <green@FreeBSD.ORG>
Cc:        Bruce Evans <bde@zeta.org.au>, arch@FreeBSD.ORG
Subject:   Re: strtod()
Message-ID:  <20020126162924.A7726@colnta.acns.ab.ca>
In-Reply-To: <200201262249.g0QMnlU91392@green.bikeshed.org>; from green@FreeBSD.ORG on Sat, Jan 26, 2002 at 05:49:46PM -0500
References:  <davidc@acns.ab.ca> <200201262249.g0QMnlU91392@green.bikeshed.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jan 26, 2002 at 05:49:46PM -0500, Brian F. Feldman wrote:
> Chad David <davidc@acns.ab.ca> wrote:
> > On Sun, Jan 27, 2002 at 07:44:20AM +1100, Bruce Evans wrote:
> > > 
> > > %%%
> > > 	errno = 0;
> > > 	num = strtouq(val, &expr, 0);
> > > 	if (errno != 0)				/* Overflow or underflow. */
> > > 		err(1, "%s", oper);
> > > 
> > > 	if (expr == val)			/* No valid digits. */
> > > 		errx(1, "%s: illegal numeric value", oper);
> > > %%%
> > > 
> > > The "Overflow or underflow" comment has rotted in 3 steps:
> > > (1) It was changed from "Overflow" to "Overflow or underflow" when
> > >     strtuol() was changed to strtoq().  This was just an obfuscation.
> > >     "Underflow" must be read as "overflow towards negative infinity",
> > >     but it's less confusing to just say "overflow".
> > > (2) The code was wrong because strto*() may set errno, and broke when
> > >     strtoq() started setting it.  The "illegal numeric value" case
> > >     became unreachable.
> > > (3) "Overflow or underflow" wasn't changed back to "Overflow" when
> > >     strtoq() was changed to strtouq().
> > 
> > Code like this is what I'm dealing with.  My point is that if you set
> > errno == 0, and then after the function it is != 0, an error DID occur,
> > as long as the return value == 0.0 or HUGE_VAL I guess.
> > 
> > Am I making any sense?
> 
> Not "as long as the return value" is anything!  Why should the function be 
> changing errno if it hasn't generated an error?  These are particularly 
> difficult functions to use in the first place, and they really shouldn't be 
> made more-so by gratuitously changing errno.  It's not hard to save errno, 
> either, in the library call...

I'm not sure if you are agreeing with me, or disagreeing with me :).

When 0.0 is returned and errno == EINVAL a lot of code assumes there was
an error, but current always returns with errno == EINVAL, which breaks
this code when "0.0" is converted..

If you are suggesting that strtod() etc. should save errno on entry and
then reset it on return (unless it wants to return its own error) then I
think I agree with that.

-- 
Chad David        davidc@acns.ab.ca
www.FreeBSD.org   davidc@freebsd.org
ACNS Inc.         Calgary, Alberta Canada
Fourthly, The constant breeders, beside the gain of eight shillings
sterling per annum by the sale of their children, will be rid of the
charge of maintaining them after the first year. - Johnathan Swift

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020126162924.A7726>