95 lines · c
1/*2 * strnlen test.3 *4 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5 * See https://llvm.org/LICENSE.txt for license information.6 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7 */8 9#define _POSIX_C_SOURCE 200809L10 11#include <stdint.h>12#include <stdio.h>13#include <stdlib.h>14#include <string.h>15#include <limits.h>16#include "stringlib.h"17 18static const struct fun19{20 const char *name;21 size_t (*fun)(const char *s, size_t m);22} funtab[] = {23#define F(x) {#x, x},24F(strnlen)25#if __aarch64__26F(__strnlen_aarch64)27# if __ARM_FEATURE_SVE28F(__strnlen_aarch64_sve)29# endif30#endif31#undef F32 {0, 0}33};34 35static int test_status;36#define ERR(...) (test_status=1, printf(__VA_ARGS__))37 38#define A 3239#define SP 51240#define LEN 25000041static char sbuf[LEN+2*A];42 43static void *alignup(void *p)44{45 return (void*)(((uintptr_t)p + A-1) & -A);46}47 48static void test(const struct fun *fun, int align, int maxlen, int len)49{50 char *src = alignup(sbuf);51 char *s = src + align;52 size_t r;53 size_t e = maxlen < len ? maxlen : len - 1;54 55 if (len > LEN || align >= A)56 abort();57 58 for (int i = 0; i < len + A; i++)59 src[i] = '?';60 for (int i = 0; i < len - 2; i++)61 s[i] = 'a' + i%23;62 s[len - 1] = '\0';63 64 r = fun->fun(s, maxlen);65 if (r != e) {66 ERR("%s(%p) returned %zu\n", fun->name, s, r);67 ERR("input: %.*s\n", align+len+1, src);68 ERR("expected: %d\n", len);69 abort();70 }71}72 73int main()74{75 int r = 0;76 for (int i=0; funtab[i].name; i++) {77 test_status = 0;78 for (int a = 0; a < A; a++) {79 int n;80 for (n = 1; n < 100; n++)81 for (int maxlen = 0; maxlen < 100; maxlen++)82 test(funtab+i, a, maxlen, n);83 for (; n < LEN; n *= 2) {84 test(funtab+i, a, n*2, n);85 test(funtab+i, a, n, n);86 test(funtab+i, a, n/2, n);87 }88 }89 printf("%s %s\n", test_status ? "FAIL" : "PASS", funtab[i].name);90 if (test_status)91 r = -1;92 }93 return r;94}95