Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 May 2009 11:46:02 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Yuri <yuri@tsoft.com>
Cc:        freebsd-bugs@freebsd.org, freebsd-gnats-submit@freebsd.org
Subject:   Re: misc/134320: strtol: overflow error when it shouldn't be
Message-ID:  <20090507113235.G9000@delplex.bde.org>
In-Reply-To: <200905062325.n46NPlSc079024@www.freebsd.org>
References:  <200905062325.n46NPlSc079024@www.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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



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