git: 606d0e4a9a86 - main - libc: Add tests for strchrnul(3).
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 02 Feb 2023 14:46:38 UTC
The branch main has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=606d0e4a9a862a7b4e3469a084834ca0e888afa4 commit 606d0e4a9a862a7b4e3469a084834ca0e888afa4 Author: Dag-Erling Smørgrav <des@FreeBSD.org> AuthorDate: 2023-02-01 20:06:20 +0000 Commit: Dag-Erling Smørgrav <des@FreeBSD.org> CommitDate: 2023-02-02 14:45:45 +0000 libc: Add tests for strchrnul(3). MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: allanjude Differential Revision: https://reviews.freebsd.org/D38286 --- contrib/netbsd-tests/lib/libc/string/t_strchr.c | 12 +- contrib/netbsd-tests/lib/libc/string/t_strchrnul.c | 293 +++++++++++++++++++++ lib/libc/tests/string/Makefile | 1 + 3 files changed, 300 insertions(+), 6 deletions(-) diff --git a/contrib/netbsd-tests/lib/libc/string/t_strchr.c b/contrib/netbsd-tests/lib/libc/string/t_strchr.c index 5dd9a62213ab..4bc304e71267 100644 --- a/contrib/netbsd-tests/lib/libc/string/t_strchr.c +++ b/contrib/netbsd-tests/lib/libc/string/t_strchr.c @@ -1,4 +1,4 @@ -/* $NetBSD: t_strchr.c,v 1.2 2017/01/10 15:34:49 christos Exp $ */ +/* $NetBSD: t_strchr.c,v 1.3 2023/01/30 19:49:49 christos Exp $ */ /* * Written by J.T. Conklin <jtc@acorntoolworks.com> @@ -247,7 +247,7 @@ ATF_TC_BODY(strchr_basic, tc) }; dl_handle = dlopen(NULL, RTLD_LAZY); - strchr_fn = dlsym(dl_handle, "test_strlen"); + strchr_fn = dlsym(dl_handle, "test_strchr"); if (!strchr_fn) strchr_fn = strchr; @@ -269,11 +269,11 @@ ATF_TC_BODY(strchr_basic, tc) /* Then for the '/' in the strings */ verify_strchr(buf + a, '/', t, a); - /* check zero extension of char arg */ - verify_strchr(buf + a, 0xffffff00 | '/', t, a); + /* check zero extension of char arg */ + verify_strchr(buf + a, 0xffffff00 | '/', t, a); - /* Replace all the '/' with 0xff */ - while ((off = slow_strchr(buf + a, '/')) != NULL) + /* Replace all the '/' with 0xff */ + while ((off = slow_strchr(buf + a, '/')) != NULL) *off = 0xff; buf[a + len] = 0xff; diff --git a/contrib/netbsd-tests/lib/libc/string/t_strchrnul.c b/contrib/netbsd-tests/lib/libc/string/t_strchrnul.c new file mode 100644 index 000000000000..62ac702523aa --- /dev/null +++ b/contrib/netbsd-tests/lib/libc/string/t_strchrnul.c @@ -0,0 +1,293 @@ +/* $NetBSD: t_strchrnul.c,v 1.1 2023/01/30 19:49:49 christos Exp $ */ + +/* + * Written by J.T. Conklin <jtc@acorntoolworks.com> + * Public domain. + */ + +#include <atf-c.h> +#include <string.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <dlfcn.h> + +static char *slow_strchrnul(char *, int); +static void verify_strchrnul(char *, int, unsigned int, unsigned int); + +char * (*volatile strchrnul_fn)(const char *, int); + +static char * +slow_strchrnul(char *buf, int ch) +{ + unsigned char c = 1; + + ch &= 0xff; + + for (; ; buf++) { + c = *buf; + if (c == ch || c == 0) + return buf; + } +} + +static void +verify_strchrnul(char *buf, int ch, unsigned int t, unsigned int a) +{ + const char *off, *ok_off; + + off = strchrnul_fn(buf, ch); + ok_off = slow_strchrnul(buf, ch); + if (off == ok_off) + return; + + fprintf(stderr, "test_strchrnul(\"%s\", %#x) gave %zd not %zd (test %d, " + "alignment %d)\n", + buf, ch, off ? off - buf : -1, ok_off ? ok_off - buf : -1, t, a); + + atf_tc_fail("Check stderr for details"); +} + +ATF_TC(strchrnul_basic); +ATF_TC_HEAD(strchrnul_basic, tc) +{ + + atf_tc_set_md_var(tc, "descr", "Test strchrnul(3) results"); +} + +ATF_TC_BODY(strchrnul_basic, tc) +{ + void *dl_handle; + char *off; + char buf[32]; + unsigned int t, a; + + const char *tab[] = { + "", + "a", + "aa", + "abc", + "abcd", + "abcde", + "abcdef", + "abcdefg", + "abcdefgh", + + "/", + "//", + "/a", + "/a/", + "/ab", + "/ab/", + "/abc", + "/abc/", + "/abcd", + "/abcd/", + "/abcde", + "/abcde/", + "/abcdef", + "/abcdef/", + "/abcdefg", + "/abcdefg/", + "/abcdefgh", + "/abcdefgh/", + + "a/", + "a//", + "a/a", + "a/a/", + "a/ab", + "a/ab/", + "a/abc", + "a/abc/", + "a/abcd", + "a/abcd/", + "a/abcde", + "a/abcde/", + "a/abcdef", + "a/abcdef/", + "a/abcdefg", + "a/abcdefg/", + "a/abcdefgh", + "a/abcdefgh/", + + "ab/", + "ab//", + "ab/a", + "ab/a/", + "ab/ab", + "ab/ab/", + "ab/abc", + "ab/abc/", + "ab/abcd", + "ab/abcd/", + "ab/abcde", + "ab/abcde/", + "ab/abcdef", + "ab/abcdef/", + "ab/abcdefg", + "ab/abcdefg/", + "ab/abcdefgh", + "ab/abcdefgh/", + + "abc/", + "abc//", + "abc/a", + "abc/a/", + "abc/ab", + "abc/ab/", + "abc/abc", + "abc/abc/", + "abc/abcd", + "abc/abcd/", + "abc/abcde", + "abc/abcde/", + "abc/abcdef", + "abc/abcdef/", + "abc/abcdefg", + "abc/abcdefg/", + "abc/abcdefgh", + "abc/abcdefgh/", + + "abcd/", + "abcd//", + "abcd/a", + "abcd/a/", + "abcd/ab", + "abcd/ab/", + "abcd/abc", + "abcd/abc/", + "abcd/abcd", + "abcd/abcd/", + "abcd/abcde", + "abcd/abcde/", + "abcd/abcdef", + "abcd/abcdef/", + "abcd/abcdefg", + "abcd/abcdefg/", + "abcd/abcdefgh", + "abcd/abcdefgh/", + + "abcde/", + "abcde//", + "abcde/a", + "abcde/a/", + "abcde/ab", + "abcde/ab/", + "abcde/abc", + "abcde/abc/", + "abcde/abcd", + "abcde/abcd/", + "abcde/abcde", + "abcde/abcde/", + "abcde/abcdef", + "abcde/abcdef/", + "abcde/abcdefg", + "abcde/abcdefg/", + "abcde/abcdefgh", + "abcde/abcdefgh/", + + "abcdef/", + "abcdef//", + "abcdef/a", + "abcdef/a/", + "abcdef/ab", + "abcdef/ab/", + "abcdef/abc", + "abcdef/abc/", + "abcdef/abcd", + "abcdef/abcd/", + "abcdef/abcde", + "abcdef/abcde/", + "abcdef/abcdef", + "abcdef/abcdef/", + "abcdef/abcdefg", + "abcdef/abcdefg/", + "abcdef/abcdefgh", + "abcdef/abcdefgh/", + + "abcdefg/", + "abcdefg//", + "abcdefg/a", + "abcdefg/a/", + "abcdefg/ab", + "abcdefg/ab/", + "abcdefg/abc", + "abcdefg/abc/", + "abcdefg/abcd", + "abcdefg/abcd/", + "abcdefg/abcde", + "abcdefg/abcde/", + "abcdefg/abcdef", + "abcdefg/abcdef/", + "abcdefg/abcdefg", + "abcdefg/abcdefg/", + "abcdefg/abcdefgh", + "abcdefg/abcdefgh/", + + "abcdefgh/", + "abcdefgh//", + "abcdefgh/a", + "abcdefgh/a/", + "abcdefgh/ab", + "abcdefgh/ab/", + "abcdefgh/abc", + "abcdefgh/abc/", + "abcdefgh/abcd", + "abcdefgh/abcd/", + "abcdefgh/abcde", + "abcdefgh/abcde/", + "abcdefgh/abcdef", + "abcdefgh/abcdef/", + "abcdefgh/abcdefg", + "abcdefgh/abcdefg/", + "abcdefgh/abcdefgh", + "abcdefgh/abcdefgh/", + }; + + dl_handle = dlopen(NULL, RTLD_LAZY); + strchrnul_fn = dlsym(dl_handle, "test_strchrnul"); + if (!strchrnul_fn) + strchrnul_fn = strchrnul; + + for (a = 3; a < 3 + sizeof(long); ++a) { + /* Put char and a \0 before the buffer */ + buf[a-1] = '/'; + buf[a-2] = '0'; + buf[a-3] = 0xff; + for (t = 0; t < (sizeof(tab) / sizeof(tab[0])); ++t) { + int len = strlen(tab[t]) + 1; + memcpy(&buf[a], tab[t], len); + + /* Put the char we are looking for after the \0 */ + buf[a + len] = '/'; + + /* Check search for NUL at end of string */ + verify_strchrnul(buf + a, 0, t, a); + + /* Then for the '/' in the strings */ + verify_strchrnul(buf + a, '/', t, a); + + /* check zero extension of char arg */ + verify_strchrnul(buf + a, 0xffffff00 | '/', t, a); + + /* Replace all the '/' with 0xff */ + while (*(off = slow_strchrnul(buf + a, '/')) != '\0') + *off = 0xff; + + buf[a + len] = 0xff; + + /* Check we can search for 0xff as well as '/' */ + verify_strchrnul(buf + a, 0xff, t, a); + } + } + (void)dlclose(dl_handle); +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, strchrnul_basic); + + return atf_no_error(); +} diff --git a/lib/libc/tests/string/Makefile b/lib/libc/tests/string/Makefile index eacf7e15c27c..5d1944113a1a 100644 --- a/lib/libc/tests/string/Makefile +++ b/lib/libc/tests/string/Makefile @@ -18,6 +18,7 @@ NETBSD_ATF_TESTS_C+= memmem_test NETBSD_ATF_TESTS_C+= memset_test NETBSD_ATF_TESTS_C+= strcat_test NETBSD_ATF_TESTS_C+= strchr_test +NETBSD_ATF_TESTS_C+= strchrnul_test NETBSD_ATF_TESTS_C+= strcmp_test NETBSD_ATF_TESTS_C+= strcpy_test NETBSD_ATF_TESTS_C+= strcspn_test