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);

Reply via email to