Date: Sat, 26 Jan 2002 22:13:11 -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: <20020126221311.A18683@colnta.acns.ab.ca> In-Reply-To: <200201270453.g0R4rwi92912@green.bikeshed.org>; from green@FreeBSD.ORG on Sat, Jan 26, 2002 at 11:53:58PM -0500 References: <davidc@acns.ab.ca> <200201270453.g0R4rwi92912@green.bikeshed.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jan 26, 2002 at 11:53:58PM -0500, Brian F. Feldman wrote: > Chad David <davidc@acns.ab.ca> wrote: > > > > 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.. > > The problem is that 0.0 could be the right return value, but if errno was > EINVAL before calling strtod(), the caller makes a mistake in assuming > "retval == 0.0 && errno == EINVAL means failure". That is true, but as I believe I stated at the beginning of this thread the Solaris strtod() man pages says: "Because 0 is returned on error and is also a valid return on success, an application wishing to check for error situa- tions should set errno to 0, then call strtod(), then check errno and if it is non-zero, assume an error has occurred." On FreeBSD current any code that does this (ie code written for Solaris) will fail everytime... but I think we are agreeing that this is wrong. I don't believe in trying to save code from itself, I just want things to work as expected. > > > 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. > > If strtod() wants to use errno internally, that's fine, but I personally > really expect it to not modify errno without also intending to return an > error; that's why saving at entry and restoring at exit is my preference for > these functions. Agreed, so is there consensus enough on this for me to offer a patch that basically does this? I also want to see where this makes the most sense to do, in strtod.c or perhaps in the locale code (which is probably called by at least everything looking for a decimal point)? -- 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?20020126221311.A18683>