Alejandro Colomar wrote:
> > > Assuming that the string matches a valid suffix, it'd succeed, but the
> > > call should have failed early.
> >
> > No, because that code is dealing with the case where the number's text is
> > missing. And if the number's text is missing it doesn't matter what the base
> > is; there are no digits to multiply the base by.
>
> I think you didn't understand me. I'll show line-by-line where I think
> it will go through.
>
> Assume I call
>
> xstrtol("k", &end, -1, ...);
This discussion is going nowhere, I think, unless we actually test things.
I therefore added your test case to the test suite, assuming the results on
a glibc system — patch below — and triggered a CI build. We will know in two
hours whether we need to adjust the test case for *BSD systems.
2024-07-25 Bruno Haible <[email protected]>
xstrtol, xstrtoll tests: Test behaviour for an invalid base.
Reported by Alejandro Colomar <[email protected]> in
<https://lists.gnu.org/archive/html/bug-gnulib/2024-07/msg00249.html>.
* modules/xstrtol-tests (Files): Add tests/macros.h.
* modules/xstrtoll-tests (Files): Likewise.
* tests/test-xstrtol.c: Include macros.h.
(main): If no arguments are given on the command line, perform
miscellaneous tests.
* tests/test-xstrtol.sh: Also invoke test-xstrtol without arguments.
* tests/test-xstrtoll.sh: Also invoke test-xstrtoll without arguments.
diff --git a/modules/xstrtol-tests b/modules/xstrtol-tests
index 1786873d07..c52e1611d8 100644
--- a/modules/xstrtol-tests
+++ b/modules/xstrtol-tests
@@ -2,6 +2,7 @@ Files:
tests/test-xstrtol.c
tests/test-xstrtoul.c
tests/test-xstrtol.sh
+tests/macros.h
Depends-on:
inttypes
diff --git a/modules/xstrtoll-tests b/modules/xstrtoll-tests
index d4e24d9d9a..d28ebca73f 100644
--- a/modules/xstrtoll-tests
+++ b/modules/xstrtoll-tests
@@ -3,6 +3,7 @@ tests/test-xstrtol.c
tests/test-xstrtoll.c
tests/test-xstrtoull.c
tests/test-xstrtoll.sh
+tests/macros.h
Depends-on:
inttypes
diff --git a/tests/test-xstrtol.c b/tests/test-xstrtol.c
index c9568379ae..f83d41905f 100644
--- a/tests/test-xstrtol.c
+++ b/tests/test-xstrtol.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <error.h>
+#include "macros.h"
#include "xstrtol-error.h"
#ifndef __xstrtol
@@ -38,25 +39,45 @@ print_no_progname (void)
int
main (int argc, char **argv)
{
- strtol_error s_err;
- int i;
-
- error_print_progname = print_no_progname;
-
- for (i = 1; i < argc; i++)
+ if (argc > 1)
{
- char *p;
- __strtol_t val;
+ /* Test cases given on the command line. */
+ int i;
- s_err = __xstrtol (argv[i], &p, 0, &val, "bckMw0");
- if (s_err == LONGINT_OK)
- {
- printf ("%s->%" __spec " (%s)\n", argv[i], val, p);
- }
- else
+ error_print_progname = print_no_progname;
+
+ for (i = 1; i < argc; i++)
{
- xstrtol_fatal (s_err, -2, 'X', NULL, argv[i]);
+ char *p;
+ __strtol_t val;
+ strtol_error s_err = __xstrtol (argv[i], &p, 0, &val, "bckMw0");
+ if (s_err == LONGINT_OK)
+ {
+ printf ("%s->%" __spec " (%s)\n", argv[i], val, p);
+ }
+ else
+ {
+ xstrtol_fatal (s_err, -2, 'X', NULL, argv[i]);
+ }
}
+
+ return 0;
+ }
+ else
+ {
+ /* Miscellaneous test cases. */
+
+ /* Test an invalid base. Reported by Alejandro Colomar. */
+ {
+ const char input[] = "k";
+ char *endp = NULL;
+ __strtol_t val = -17;
+ strtol_error s_err = __xstrtol (input, &endp, -1, &val, "k");
+ ASSERT (s_err == LONGINT_INVALID);
+ ASSERT (endp == NULL);
+ ASSERT (val == -17);
+ }
+
+ return test_exit_status;
}
- exit (0);
}
diff --git a/tests/test-xstrtol.sh b/tests/test-xstrtol.sh
index e82b585bf4..cec0a30764 100755
--- a/tests/test-xstrtol.sh
+++ b/tests/test-xstrtol.sh
@@ -68,4 +68,7 @@ EOF
compare expected out || result=1
+# Other misc tests.
+${CHECKER} test-xstrtol || result=1
+
Exit $result
diff --git a/tests/test-xstrtoll.sh b/tests/test-xstrtoll.sh
index d738acc381..b8d235adce 100755
--- a/tests/test-xstrtoll.sh
+++ b/tests/test-xstrtoll.sh
@@ -64,4 +64,7 @@ EOF
compare expected out || result=1
+# Other misc tests.
+${CHECKER} test-xstrtoll || result=1
+
Exit $result