Path: blob/main/lib/libc/tests/string/memrchr_test.c
39491 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2023 Robert Clausecker4*/56#include <sys/cdefs.h>78#include <dlfcn.h>9#include <limits.h>10#include <string.h>1112#include <atf-c.h>1314static void *(*memrchr_fn)(const void *, int, size_t);1516ATF_TC_WITHOUT_HEAD(null);17ATF_TC_BODY(null, tc)18{19ATF_CHECK_EQ(memrchr_fn(NULL, 42, 0), NULL);20}2122ATF_TC_WITHOUT_HEAD(not_found);23ATF_TC_BODY(not_found, tc)24{25size_t i, j;26char buf[1+15+64+1]; /* offset [0..15] + 64 buffer bytes + sentinels */2728buf[0] = 'X';29memset(buf + 1, '-', sizeof(buf) - 1);3031for (i = 0; i < 16; i++)32for (j = 0; j < 64; j++) {33buf[i + j + 1] = 'X';34ATF_CHECK_EQ(memrchr_fn(buf + i + 1, 'X', j), NULL);35buf[i + j + 1] = '-';36}37}3839static void40do_found_test(char buf[], size_t len, size_t first, size_t second)41{42/* invariant: first <= second */4344buf[first] = 'X';45buf[second] = 'X';46ATF_CHECK_EQ(memrchr_fn(buf, 'X', len), buf + second);47buf[first] = '-';48buf[second] = '-';49}5051ATF_TC_WITHOUT_HEAD(found);52ATF_TC_BODY(found, tc)53{54size_t i, j, k, l;55char buf[1+15+64+1];5657buf[0] = 'X';58memset(buf + 1, '-', sizeof(buf) - 1);5960for (i = 0; i < 16; i++)61for (j = 0; j < 64; j++)62for (k = 0; k < j; k++)63for (l = 0; l <= k; l++) {64buf[i + j + 1] = 'X';65do_found_test(buf + i + 1, j, l, k);66buf[i + j + 1] = '-';67}68}6970/* check that the right character is found */71static void72do_values_test(unsigned char buf[], size_t len, size_t i, int c)73{74/* sentinels */75buf[-1] = c;76buf[len] = c;77memset(buf, c + 1, len);7879if (i < len) {80buf[i] = c;81ATF_CHECK_EQ(memrchr_fn(buf, c, len), buf + i);82} else83ATF_CHECK_EQ(memrchr_fn(buf, c, len), NULL);84}8586ATF_TC_WITHOUT_HEAD(values);87ATF_TC_BODY(values, tc)88{89size_t i, j, k;90int c;91unsigned char buf[1+15+64+1];9293for (i = 0; i < 16; i++)94for (j = 0; j < 64; j++)95for (k = 0; k <= j; k++)96for (c = 0; c <= UCHAR_MAX; c++)97do_values_test(buf + i + 1, j, k, c);98}99100ATF_TP_ADD_TCS(tp)101{102void *dl_handle;103104dl_handle = dlopen(NULL, RTLD_LAZY);105memrchr_fn = dlsym(dl_handle, "test_memrchr");106if (memrchr_fn == NULL)107memrchr_fn = memrchr;108109ATF_TP_ADD_TC(tp, null);110ATF_TP_ADD_TC(tp, not_found);111ATF_TP_ADD_TC(tp, found);112ATF_TP_ADD_TC(tp, values);113114return (atf_no_error());115}116117118