Message ID | 1424400307-13664-4-git-send-email-dja@axtens.net |
---|---|
State | Accepted |
Headers | show |
On Fri, 2015-02-20 at 13:45 +1100, Daniel Axtens wrote: > The behaviour of atoi/atol on glibc (and according to the spec) is > to assume base 10, not to autodetect the base. > > Signed-off-by: Daniel Axtens <dja@axtens.net> Reviewed-by: Cyril Bur <cyrilbur@gmail.com> > --- > libc/stdlib/atoi.c | 2 +- > libc/stdlib/atol.c | 2 +- > libc/test/run-stdlib.c | 11 +++++++---- > 3 files changed, 9 insertions(+), 6 deletions(-) > > diff --git a/libc/stdlib/atoi.c b/libc/stdlib/atoi.c > index d2fb33b..444c05a 100644 > --- a/libc/stdlib/atoi.c > +++ b/libc/stdlib/atoi.c > @@ -14,5 +14,5 @@ > > int atoi(const char *str) > { > - return strtol(str, NULL, 0); > + return strtol(str, NULL, 10); > } > diff --git a/libc/stdlib/atol.c b/libc/stdlib/atol.c > index a6aa47b..e73c7d4 100644 > --- a/libc/stdlib/atol.c > +++ b/libc/stdlib/atol.c > @@ -14,5 +14,5 @@ > > long atol(const char *str) > { > - return strtol(str, NULL, 0); > + return strtol(str, NULL, 10); > } > diff --git a/libc/test/run-stdlib.c b/libc/test/run-stdlib.c > index 98c79b7..1f3a2e1 100644 > --- a/libc/test/run-stdlib.c > +++ b/libc/test/run-stdlib.c > @@ -39,15 +39,18 @@ int main(void) > assert(atoi(buf) == 42); > assert(atoi("42isthemagicnumber") == 42); > > - /* our atoi recognises hex! */ > - assert(atoi("0x800") == 0x800); > - /* But not with a duplicate prefix */ > - assert(atoi("0x0x800") == 0); > + /* atoi is base 10 only */ > + assert(atoi("0x800") == 0); > > /* atol - ensure it recognises longs */ > assert(atol("2147483648") == 2147483648); > assert(atol("-2147483649") == -2147483649); > > + /* strtol detects hex */ > + assert(strtol("0x800", NULL, 0) == 0x800); > + /* But not with a duplicate prefix */ > + assert(strtol("0x0x800", NULL, 0) == 0); > + > /* strtol - invalid/weird bases */ > assert(strtol("z", NULL, -1) == 0); > assert(strtol("11111", NULL, 1) == 0);
diff --git a/libc/stdlib/atoi.c b/libc/stdlib/atoi.c index d2fb33b..444c05a 100644 --- a/libc/stdlib/atoi.c +++ b/libc/stdlib/atoi.c @@ -14,5 +14,5 @@ int atoi(const char *str) { - return strtol(str, NULL, 0); + return strtol(str, NULL, 10); } diff --git a/libc/stdlib/atol.c b/libc/stdlib/atol.c index a6aa47b..e73c7d4 100644 --- a/libc/stdlib/atol.c +++ b/libc/stdlib/atol.c @@ -14,5 +14,5 @@ long atol(const char *str) { - return strtol(str, NULL, 0); + return strtol(str, NULL, 10); } diff --git a/libc/test/run-stdlib.c b/libc/test/run-stdlib.c index 98c79b7..1f3a2e1 100644 --- a/libc/test/run-stdlib.c +++ b/libc/test/run-stdlib.c @@ -39,15 +39,18 @@ int main(void) assert(atoi(buf) == 42); assert(atoi("42isthemagicnumber") == 42); - /* our atoi recognises hex! */ - assert(atoi("0x800") == 0x800); - /* But not with a duplicate prefix */ - assert(atoi("0x0x800") == 0); + /* atoi is base 10 only */ + assert(atoi("0x800") == 0); /* atol - ensure it recognises longs */ assert(atol("2147483648") == 2147483648); assert(atol("-2147483649") == -2147483649); + /* strtol detects hex */ + assert(strtol("0x800", NULL, 0) == 0x800); + /* But not with a duplicate prefix */ + assert(strtol("0x0x800", NULL, 0) == 0); + /* strtol - invalid/weird bases */ assert(strtol("z", NULL, -1) == 0); assert(strtol("11111", NULL, 1) == 0);
The behaviour of atoi/atol on glibc (and according to the spec) is to assume base 10, not to autodetect the base. Signed-off-by: Daniel Axtens <dja@axtens.net> --- libc/stdlib/atoi.c | 2 +- libc/stdlib/atol.c | 2 +- libc/test/run-stdlib.c | 11 +++++++---- 3 files changed, 9 insertions(+), 6 deletions(-)