misc/69788: The processing result of strtoul() cannot judge whether it is an error.

Steven Smith sos22 at cantab.net
Fri Jul 30 00:20:38 PDT 2004


The following reply was made to PR misc/69788; it has been noted by GNATS.

From: Steven Smith <sos22 at cantab.net>
To: Takayuki Sakuma <takayuki at finet.fujitsu.com>
Cc: freebsd-gnats-submit at FreeBSD.org, sos22 at srcf.ucam.org
Subject: Re: misc/69788: The processing result of strtoul() cannot judge whether it is an error.
Date: Fri, 30 Jul 2004 08:12:42 +0100

 --liOOAslEiF7prFVr
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 Content-Transfer-Encoding: quoted-printable
 
 >         errno=3D0;
 >         ul =3D strtoul("4294967295", &p, 10);
 >         printf("ul=3D%lu,*p=3D%x,errno=3D%d(%s)\n", ul, *p, errno, strerr=
 or(errno));
 >=20
 > result:
 > ul=3D4294967295,*p=3D0,errno=3D22(Unknown error: 0)
 
 In my tests, strtoul correctly leaves errno at 0:
 	errno=3D0;
 	ul =3D strtoul("4294967295", &p, 10);
 	o_errno =3D errno;=09
 	printf("ul=3D%lu,*p=3D%x,errno=3D%d(%s)\n", ul, *p, o_errno,strerror(errno=
 ));
 =20
 gives the result ``ul=3D4294967295,*p=3D0,errno=3D0(Unknown error: 0)'', as
 expected.  The problem with the original test case is that strerror()
 is setting errno to EINVAL (because 0 isn't a valid error number)
 before errno is pushed on the stack for printf (the order in which
 function arguments are evaluated is undefined in C).
 
 Steven Smith,
 sos22 at cantab.net.
 --=20
 One day, I'm going to get an Alice-bot to answer all my email for me,
 and see how long it takes people to notice.
 
 --liOOAslEiF7prFVr
 Content-Type: application/pgp-signature
 Content-Disposition: inline
 
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.2.4 (FreeBSD)
 
 iD8DBQFBCfTqO4S8/gLNrjcRAjpOAJ9NjV/uXuyDyTVjZgSo3vO3NubF2gCfVHo6
 wmgzDCyCrVNPkA9VvQTbwi8=
 =etGX
 -----END PGP SIGNATURE-----
 
 --liOOAslEiF7prFVr--


More information about the freebsd-bugs mailing list