xref: /freebsd/lib/libc/tests/string/strnlen_test.c (revision 7bedae81adaff4b4d291ba1f650b5b915ce207bf)
1*7bedae81SStrahinja Stanišić /*-
2*7bedae81SStrahinja Stanišić  * SPDX-License-Identifier: BSD-2-Clause
3*7bedae81SStrahinja Stanišić  *
4*7bedae81SStrahinja Stanišić  * Copyright (c) 2024 Strahinja Stanisic <strajabot@FreeBSD.org>
5*7bedae81SStrahinja Stanišić  */
6*7bedae81SStrahinja Stanišić 
7*7bedae81SStrahinja Stanišić #include <string.h>
8*7bedae81SStrahinja Stanišić #include <unistd.h>
9*7bedae81SStrahinja Stanišić #include <stdio.h>
10*7bedae81SStrahinja Stanišić #include <stdlib.h>
11*7bedae81SStrahinja Stanišić #include <stdalign.h>
12*7bedae81SStrahinja Stanišić #include <stdint.h>
13*7bedae81SStrahinja Stanišić 
14*7bedae81SStrahinja Stanišić #include <atf-c.h>
15*7bedae81SStrahinja Stanišić 
16*7bedae81SStrahinja Stanišić ATF_TC(strnlen_alignments);
ATF_TC_HEAD(strnlen_alignments,tc)17*7bedae81SStrahinja Stanišić ATF_TC_HEAD(strnlen_alignments, tc)
18*7bedae81SStrahinja Stanišić {
19*7bedae81SStrahinja Stanišić     atf_tc_set_md_var(tc, "descr", "Test strnlen(3) with different alignments");
20*7bedae81SStrahinja Stanišić }
21*7bedae81SStrahinja Stanišić 
ATF_TC_BODY(strnlen_alignments,tc)22*7bedae81SStrahinja Stanišić ATF_TC_BODY(strnlen_alignments, tc)
23*7bedae81SStrahinja Stanišić {
24*7bedae81SStrahinja Stanišić 	size_t (*strnlen_fn)(const char*, size_t) = strnlen;
25*7bedae81SStrahinja Stanišić 	char alignas(16) buffer[1 + 16 + 64 + 1 + 1];
26*7bedae81SStrahinja Stanišić 
27*7bedae81SStrahinja Stanišić 	memset(buffer, '/', sizeof(buffer));
28*7bedae81SStrahinja Stanišić 
29*7bedae81SStrahinja Stanišić 	for (int align = 1; align < 1 + 16; align++) {
30*7bedae81SStrahinja Stanišić 		char *s = buffer + align;
31*7bedae81SStrahinja Stanišić 
32*7bedae81SStrahinja Stanišić 		for (size_t maxlen = 0; maxlen <= 64; maxlen++) {
33*7bedae81SStrahinja Stanišić 			for (size_t len = 0; len <= maxlen; len++) {
34*7bedae81SStrahinja Stanišić 				/* returns length */
35*7bedae81SStrahinja Stanišić 
36*7bedae81SStrahinja Stanišić 				/* without sentinels */
37*7bedae81SStrahinja Stanišić 				s[len] = '\0';
38*7bedae81SStrahinja Stanišić 				size_t val = strnlen_fn(s, maxlen);
39*7bedae81SStrahinja Stanišić 				if (val != len) {
40*7bedae81SStrahinja Stanišić 					fprintf(stderr, "align =  %d, maxlen = %zu, len = %zu",
41*7bedae81SStrahinja Stanišić 					    align, maxlen, len);
42*7bedae81SStrahinja Stanišić 					atf_tc_fail("returned incorrect len");
43*7bedae81SStrahinja Stanišić 				}
44*7bedae81SStrahinja Stanišić 
45*7bedae81SStrahinja Stanišić 				/* with sentinels */
46*7bedae81SStrahinja Stanišić 				s[-1] = '\0';
47*7bedae81SStrahinja Stanišić 				s[maxlen + 1] = '\0';
48*7bedae81SStrahinja Stanišić 				val = strnlen_fn(s, maxlen);
49*7bedae81SStrahinja Stanišić 				if (val != len) {
50*7bedae81SStrahinja Stanišić 					fprintf(stderr, "align =  %d, maxlen = %zu, len = %zu",
51*7bedae81SStrahinja Stanišić 					    align, maxlen, len);
52*7bedae81SStrahinja Stanišić 					atf_tc_fail("returned incorrect len (sentinels)");
53*7bedae81SStrahinja Stanišić 				}
54*7bedae81SStrahinja Stanišić 
55*7bedae81SStrahinja Stanišić 				/* cleanup */
56*7bedae81SStrahinja Stanišić 				s[-1] = '/';
57*7bedae81SStrahinja Stanišić 				s[len] = '/';
58*7bedae81SStrahinja Stanišić 				s[maxlen + 1] = '/';
59*7bedae81SStrahinja Stanišić 
60*7bedae81SStrahinja Stanišić 			}
61*7bedae81SStrahinja Stanišić 
62*7bedae81SStrahinja Stanišić 			/* returns maxlen */
63*7bedae81SStrahinja Stanišić 
64*7bedae81SStrahinja Stanišić 			/* without sentinels */
65*7bedae81SStrahinja Stanišić 			size_t val = strnlen_fn(s, maxlen);
66*7bedae81SStrahinja Stanišić 			if (val != maxlen) {
67*7bedae81SStrahinja Stanišić 				fprintf(stderr, "align =  %d, maxlen = %zu",
68*7bedae81SStrahinja Stanišić 				     align, maxlen);
69*7bedae81SStrahinja Stanišić 				atf_tc_fail("should return maxlen");
70*7bedae81SStrahinja Stanišić 			}
71*7bedae81SStrahinja Stanišić 
72*7bedae81SStrahinja Stanišić 			/* with sentinels */
73*7bedae81SStrahinja Stanišić 			s[-1] = '\0';
74*7bedae81SStrahinja Stanišić 			s[maxlen + 1] = '\0';
75*7bedae81SStrahinja Stanišić 			val = strnlen_fn(s, maxlen);
76*7bedae81SStrahinja Stanišić 			if (val != maxlen) {
77*7bedae81SStrahinja Stanišić 				fprintf(stderr, "align =  %d, maxlen = %zu",
78*7bedae81SStrahinja Stanišić 				    align, maxlen);
79*7bedae81SStrahinja Stanišić 				atf_tc_fail("should return maxlen (sentinels)");
80*7bedae81SStrahinja Stanišić 			}
81*7bedae81SStrahinja Stanišić 
82*7bedae81SStrahinja Stanišić 			/* cleanup */
83*7bedae81SStrahinja Stanišić 			s[-1] = '/';
84*7bedae81SStrahinja Stanišić 			s[maxlen + 1] = '/';
85*7bedae81SStrahinja Stanišić 		}
86*7bedae81SStrahinja Stanišić 	}
87*7bedae81SStrahinja Stanišić }
88*7bedae81SStrahinja Stanišić 
89*7bedae81SStrahinja Stanišić ATF_TC(strnlen_size_max);
ATF_TC_HEAD(strnlen_size_max,tc)90*7bedae81SStrahinja Stanišić ATF_TC_HEAD(strnlen_size_max, tc)
91*7bedae81SStrahinja Stanišić {
92*7bedae81SStrahinja Stanišić     atf_tc_set_md_var(tc, "descr", "Test strnlen(3) with maxlen=SIZE_MAX");
93*7bedae81SStrahinja Stanišić }
94*7bedae81SStrahinja Stanišić 
ATF_TC_BODY(strnlen_size_max,tc)95*7bedae81SStrahinja Stanišić ATF_TC_BODY(strnlen_size_max, tc)
96*7bedae81SStrahinja Stanišić {
97*7bedae81SStrahinja Stanišić 	size_t (*strnlen_fn)(const char*, size_t) = strnlen;
98*7bedae81SStrahinja Stanišić 	char alignas(16) buffer[1 + 16 + 64 + 1 + 1];
99*7bedae81SStrahinja Stanišić 
100*7bedae81SStrahinja Stanišić 	memset(buffer, '/', sizeof(buffer));
101*7bedae81SStrahinja Stanišić 
102*7bedae81SStrahinja Stanišić 	for (int align = 1; align < 1 + 16; align++) {
103*7bedae81SStrahinja Stanišić 		char* s = buffer + align;
104*7bedae81SStrahinja Stanišić 
105*7bedae81SStrahinja Stanišić 		for (size_t len = 0; len <= 64; len++) {
106*7bedae81SStrahinja Stanišić 			/* returns length */
107*7bedae81SStrahinja Stanišić 
108*7bedae81SStrahinja Stanišić 			/* without sentinels */
109*7bedae81SStrahinja Stanišić 			s[len] = '\0';
110*7bedae81SStrahinja Stanišić 			size_t val = strnlen_fn(s, SIZE_MAX);
111*7bedae81SStrahinja Stanišić 			if (val != len) {
112*7bedae81SStrahinja Stanišić 				fprintf(stderr, "align =  %d, maxlen = %zu, len = %zu",
113*7bedae81SStrahinja Stanišić 				    align, SIZE_MAX, len);
114*7bedae81SStrahinja Stanišić 				atf_tc_fail("returned incorrect len (SIZE_MAX)");
115*7bedae81SStrahinja Stanišić 			}
116*7bedae81SStrahinja Stanišić 
117*7bedae81SStrahinja Stanišić 			/* with sentinels */
118*7bedae81SStrahinja Stanišić 			s[-1] = '\0';
119*7bedae81SStrahinja Stanišić 			val = strnlen_fn(s, SIZE_MAX);
120*7bedae81SStrahinja Stanišić 			if (val != len) {
121*7bedae81SStrahinja Stanišić 				fprintf(stderr, "align =  %d, maxlen = %zu, len = %zu",
122*7bedae81SStrahinja Stanišić 				    align, SIZE_MAX, len);
123*7bedae81SStrahinja Stanišić 				atf_tc_fail("returned incorrect len (sentinels) (SIZE_MAX)");
124*7bedae81SStrahinja Stanišić 			}
125*7bedae81SStrahinja Stanišić 
126*7bedae81SStrahinja Stanišić 			/* cleanup */
127*7bedae81SStrahinja Stanišić 			s[-1] = '/';
128*7bedae81SStrahinja Stanišić 			s[len] = '/';
129*7bedae81SStrahinja Stanišić 		}
130*7bedae81SStrahinja Stanišić 	}
131*7bedae81SStrahinja Stanišić }
132*7bedae81SStrahinja Stanišić 
133*7bedae81SStrahinja Stanišić 
134*7bedae81SStrahinja Stanišić 
ATF_TP_ADD_TCS(tp)135*7bedae81SStrahinja Stanišić ATF_TP_ADD_TCS(tp)
136*7bedae81SStrahinja Stanišić {
137*7bedae81SStrahinja Stanišić 	ATF_TP_ADD_TC(tp, strnlen_alignments);
138*7bedae81SStrahinja Stanišić 	ATF_TP_ADD_TC(tp, strnlen_size_max);
139*7bedae81SStrahinja Stanišić 
140*7bedae81SStrahinja Stanišić 	return atf_no_error();
141*7bedae81SStrahinja Stanišić }
142