misc/134320: strtol: overflow error when it shouldn't be
Bruce Evans
brde at optusnet.com.au
Thu May 7 04:35:48 UTC 2009
On Wed, 6 May 2009, Yuri wrote:
> main() {
> const char *nptr = "d223d221";
> long l = ::strtol(nptr, NULL, 16);
> printf("l=%x errno=%i err=%s\n", l, errno, strerror(errno));
> }
> ------------------------
>
> It prints: l=7fffffff errno=34 err=Result too large
>
> Why result is too large? 0xd223d221 is a valid representation of a signed 32-bit integer between LONG_MIN=-2,147,483,648(0x80000000) and LONG_MAX=+2,147,483,647(0x7fffffff).
Hex values are non-negative, so they can never give a valid representation
of a negative integer. Here 0xd223d221 is an integer exceeding LONG_MAX.
Bruce
More information about the freebsd-bugs
mailing list