Module Name: src Committed By: christos Date: Mon Jul 22 16:41:05 UTC 2024
Modified Files: src/tests/lib/libc/stdlib: t_strtol.c Log Message: Add strto{i,u}max tests and invalid base tests To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/tests/lib/libc/stdlib/t_strtol.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libc/stdlib/t_strtol.c diff -u src/tests/lib/libc/stdlib/t_strtol.c:1.7 src/tests/lib/libc/stdlib/t_strtol.c:1.8 --- src/tests/lib/libc/stdlib/t_strtol.c:1.7 Thu Jul 6 17:08:44 2017 +++ src/tests/lib/libc/stdlib/t_strtol.c Mon Jul 22 12:41:05 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: t_strtol.c,v 1.7 2017/07/06 21:08:44 joerg Exp $ */ +/* $NetBSD: t_strtol.c,v 1.8 2024/07/22 16:41:05 christos Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -30,10 +30,11 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_strtol.c,v 1.7 2017/07/06 21:08:44 joerg Exp $"); +__RCSID("$NetBSD: t_strtol.c,v 1.8 2024/07/22 16:41:05 christos Exp $"); #include <atf-c.h> #include <errno.h> +#include <inttypes.h> #include <stdlib.h> #include <string.h> #include <limits.h> @@ -45,10 +46,8 @@ struct test { const char *end; }; -static void check(struct test *, long int, long long int, char *); - static void -check(struct test *t, long int li, long long int lli, char *end) +check(struct test *t, long int li, long long int lli, intmax_t ji, char *end) { if (li != -1 && li != t->res) @@ -59,6 +58,10 @@ check(struct test *t, long int li, long atf_tc_fail_nonfatal("strtoll(%s, NULL, %d) failed " "(rv = %lld)", t->str, t->base, lli); + if (ji != -1 && ji != t->res) + atf_tc_fail_nonfatal("strtoll(%s, NULL, %d) failed " + "(rv = %jd)", t->str, t->base, ji); + if ((t->end != NULL && strcmp(t->end, end) != 0) || (t->end == NULL && *end != '\0')) atf_tc_fail_nonfatal("invalid end pointer (%p) from " @@ -102,8 +105,10 @@ ATF_TC_BODY(strtol_base, tc) long long int lli; long int li; + intmax_t ji; long long int ulli; long int uli; + uintmax_t uji; char *end, *end2; size_t i; @@ -111,24 +116,68 @@ ATF_TC_BODY(strtol_base, tc) li = strtol(t[i].str, &end, t[i].base); lli = strtoll(t[i].str, NULL, t[i].base); + ji = strtoimax(t[i].str, NULL, t[i].base); uli = strtoul(t[i].str, &end2, t[i].base); ulli = strtoull(t[i].str, NULL, t[i].base); + uji = strtoumax(t[i].str, NULL, t[i].base); - check(&t[i], li, lli, end); + check(&t[i], li, lli, ji, end); if (li != uli) atf_tc_fail_nonfatal("strtoul(%s, NULL, %d) failed " "(rv = %lu)", t[i].str, t[i].base, uli); - if (end != end2) - atf_tc_fail_nonfatal("invalid end pointer ('%p') from " - "strtoul(%s, &end, %d)", end2, t[i].str, t[i].base); if (lli != ulli) atf_tc_fail_nonfatal("strtoull(%s, NULL, %d) failed " "(rv = %llu)", t[i].str, t[i].base, ulli); + if ((uintmax_t)ji != uji) + atf_tc_fail_nonfatal("strtoumax(%s, NULL, %d) failed " + "(rv = %ju)", t[i].str, t[i].base, uji); + if (end != end2) + atf_tc_fail_nonfatal("invalid end pointer ('%p') from " + "strtoul(%s, &end, %d)", end2, t[i].str, t[i].base); } } +ATF_TC(strtol_invbase); +ATF_TC_HEAD(strtol_invbase, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test strtol(3) with an invalid base"); +} + +ATF_TC_BODY(strtol_invbase, tc) +{ + long long int lli; + long int li; + intmax_t ji; + long long int ulli; + long int uli; + uintmax_t uji; + char *end; + char boo[] = "boo"; + const char str[] = "1"; + +#define CHECK(r, f, fun) \ + end = boo; \ + r = fun(str, &end, -2); \ + if (strcmp(str, end) != 0) \ + atf_tc_fail_nonfatal( \ + "%s(1, boo, -2) failed endptr=%s ", # fun, end); \ + if (r) \ + atf_tc_fail_nonfatal( \ + "%s(1, boo, -2) failed rv=" f, # fun, r); \ + if (errno != EINVAL) \ + atf_tc_fail_nonfatal( \ + "%s(1, boo, -2) failed errno=%d", # fun, errno) + + CHECK(li, "%ld", strtol); + CHECK(lli, "%lld", strtoll); + CHECK(ji, "%jd", strtoimax); + CHECK(uli, "%lu", strtoul); + CHECK(ulli, "%llu", strtoull); + CHECK(uji, "%ju", strtoumax); +} + ATF_TC(strtol_case); ATF_TC_HEAD(strtol_case, tc) { @@ -151,6 +200,7 @@ ATF_TC_BODY(strtol_case, tc) long long int lli; long int li; + intmax_t ji; char *end; size_t i; @@ -158,8 +208,9 @@ ATF_TC_BODY(strtol_case, tc) li = strtol(t[i].str, &end, t[i].base); lli = strtoll(t[i].str, NULL, t[i].base); + ji = strtoimax(t[i].str, NULL, t[i].base); - check(&t[i], li, lli, end); + check(&t[i], li, lli, ji, end); } } @@ -199,7 +250,7 @@ ATF_TC_BODY(strtol_range, tc) if (errno != ERANGE) atf_tc_fail("strtol(3) did not catch ERANGE"); - check(&t[i], li, -1, end); + check(&t[i], li, -1, -1, end); } } @@ -230,6 +281,7 @@ ATF_TC_BODY(strtol_signed, tc) long long int lli; long int li; + intmax_t ji; char *end; size_t i; @@ -237,14 +289,16 @@ ATF_TC_BODY(strtol_signed, tc) li = strtol(t[i].str, &end, t[i].base); lli = strtoll(t[i].str, NULL, t[i].base); + ji = strtoimax(t[i].str, NULL, t[i].base); - check(&t[i], li, lli, end); + check(&t[i], li, lli, ji, end); } } ATF_TP_ADD_TCS(tp) { + ATF_TP_ADD_TC(tp, strtol_invbase); ATF_TP_ADD_TC(tp, strtol_base); ATF_TP_ADD_TC(tp, strtol_case); ATF_TP_ADD_TC(tp, strtol_range);