mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 13:52:28 +00:00
Make more functions friendly to Address Sanitizer
This commit is contained in:
parent
3ab76b2312
commit
cbfd4ccd1e
70 changed files with 1267 additions and 291 deletions
|
@ -26,6 +26,7 @@ TEST_LIBC_CRYPTO_DIRECTDEPS = \
|
|||
LIBC_INTRIN \
|
||||
LIBC_NEXGEN32E \
|
||||
LIBC_RUNTIME \
|
||||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_TESTLIB
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ TEST_LIBC_MEM_DIRECTDEPS = \
|
|||
LIBC_RAND \
|
||||
LIBC_RUNTIME \
|
||||
LIBC_STDIO \
|
||||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_SYSV \
|
||||
LIBC_TESTLIB
|
||||
|
|
|
@ -17,77 +17,117 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/bits/safemacros.h"
|
||||
#include "libc/macros.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
#define N 256
|
||||
#define S 7
|
||||
#define N 65
|
||||
#define S 1
|
||||
|
||||
long i, j, n;
|
||||
char *b1, *b2;
|
||||
char *b0, *b1, *b2;
|
||||
|
||||
noinline char *PosixMemmove(char *dst, const char *src, size_t n) {
|
||||
char *tmp;
|
||||
tmp = malloc(n);
|
||||
memcpy(tmp, src, n);
|
||||
memcpy(dst, tmp, n);
|
||||
free(tmp);
|
||||
return dst;
|
||||
}
|
||||
|
||||
TEST(memmove, overlapping) {
|
||||
for (i = 0; i < N; i += S) {
|
||||
for (j = 10; j < N; j += S) {
|
||||
b1 = malloc(N);
|
||||
b2 = malloc(N);
|
||||
n = min(N - i, N - j);
|
||||
memcpy(b2, b1 + i, n);
|
||||
ASSERT_EQ(b1 + j, memmove(b1 + j, b1 + i, n));
|
||||
ASSERT_EQ(0, memcmp(b1 + j, b2, n));
|
||||
free(b2);
|
||||
free(b1);
|
||||
for (j = 0; j < N; j += S) {
|
||||
for (n = MIN(N - i, N - j) + 1; n--;) {
|
||||
b0 = rngset(malloc(N), N, rand64, -1);
|
||||
b1 = memcpy(malloc(N), b0, N);
|
||||
b2 = memcpy(malloc(N), b0, N);
|
||||
ASSERT_EQ(b1 + j, memmove(b1 + j, b1 + i, n));
|
||||
ASSERT_EQ(b2 + j, PosixMemmove(b2 + j, b2 + i, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, N),
|
||||
"j=%ld i=%ld n=%ld\n"
|
||||
"\t%#.*s data\n"
|
||||
"\t%#.*s memmove\n"
|
||||
"\t%#.*s posix",
|
||||
j, i, n, n, b0, n, b1, n, b2);
|
||||
free(b2);
|
||||
free(b1);
|
||||
free(b0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(memmove$pure, overlapping) {
|
||||
for (i = 0; i < N; i += S) {
|
||||
for (j = 0; j < N; j += S) {
|
||||
for (n = MIN(N - i, N - j) + 1; n--;) {
|
||||
b0 = rngset(malloc(N), N, rand64, -1);
|
||||
b1 = memcpy(malloc(N), b0, N);
|
||||
b2 = memcpy(malloc(N), b0, N);
|
||||
ASSERT_EQ(b1 + j, memmove$pure(b1 + j, b1 + i, n));
|
||||
ASSERT_EQ(b2 + j, PosixMemmove(b2 + j, b2 + i, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, N),
|
||||
"j=%ld i=%ld n=%ld\n"
|
||||
"\t%#.*s data\n"
|
||||
"\t%#.*s memmove\n"
|
||||
"\t%#.*s posix",
|
||||
j, i, n, n, b0, n, b1, n, b2);
|
||||
free(b2);
|
||||
free(b1);
|
||||
free(b0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(memcpy, overlapping) {
|
||||
for (i = 0; i < N; i += S) {
|
||||
for (j = 0; j < N; j += S) {
|
||||
for (n = MIN(N - i, N - j) + 1; n--;) {
|
||||
if (j <= i) {
|
||||
b0 = rngset(malloc(N), N, rand64, -1);
|
||||
b1 = memcpy(malloc(N), b0, N);
|
||||
b2 = memcpy(malloc(N), b0, N);
|
||||
ASSERT_EQ(b1 + j, memcpy(b1 + j, b1 + i, n));
|
||||
ASSERT_EQ(b2 + j, PosixMemmove(b2 + j, b2 + i, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, N),
|
||||
"j=%ld i=%ld n=%ld\n"
|
||||
"\t%#.*s data\n"
|
||||
"\t%#.*s memmove\n"
|
||||
"\t%#.*s posix",
|
||||
j, i, n, n, b0, n, b1, n, b2);
|
||||
free(b2);
|
||||
free(b1);
|
||||
free(b0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(memmove, overlappingDirect) {
|
||||
for (i = 0; i < N; i += S) {
|
||||
for (j = 10; j < N; j += S) {
|
||||
b1 = malloc(N);
|
||||
b2 = malloc(N);
|
||||
n = min(N - i, N - j);
|
||||
memcpy(b2, b1 + i, n);
|
||||
ASSERT_EQ(b1 + j, (memmove)(b1 + j, b1 + i, n));
|
||||
ASSERT_EQ(0, memcmp(b1 + j, b2, n));
|
||||
free(b2);
|
||||
free(b1);
|
||||
for (j = 0; j < N; j += S) {
|
||||
for (n = MIN(N - i, N - j) + 1; n--;) {
|
||||
b0 = rngset(malloc(N), N, rand64, -1);
|
||||
b1 = memcpy(malloc(N), b0, N);
|
||||
b2 = memcpy(malloc(N), b0, N);
|
||||
ASSERT_EQ(b1 + j, (memmove)(b1 + j, b1 + i, n));
|
||||
ASSERT_EQ(b2 + j, PosixMemmove(b2 + j, b2 + i, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, N),
|
||||
"j=%ld i=%ld n=%ld\n"
|
||||
"\t%#.*s data\n"
|
||||
"\t%#.*s memmove\n"
|
||||
"\t%#.*s posix",
|
||||
j, i, n, n, b0, n, b1, n, b2);
|
||||
free(b2);
|
||||
free(b1);
|
||||
free(b0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char *MoveMemory(char *dst, const char *src, size_t n) {
|
||||
size_t i;
|
||||
for (i = 0; i < n; ++i) {
|
||||
dst[i] = src[i];
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
TEST(memmove, overlappingBackwards_isGenerallySafe) {
|
||||
char buf[32];
|
||||
strcpy(buf, "abcdefghijklmnopqrstuvwxyz");
|
||||
ASSERT_STREQ("cdefghijklmnopqrstuvwxyzyz", MoveMemory(buf, buf + 2, 24));
|
||||
strcpy(buf, "abcdefghijklmnopqrstuvwxyz");
|
||||
ASSERT_STREQ("cdefghijklmnopqrstuvwxyzyz", memmove(buf, buf + 2, 24));
|
||||
strcpy(buf, "abcdefghijklmnopqrstuvwxyz");
|
||||
ASSERT_STREQ("cdefghijklmnopqrstuvwxyzyz", memcpy(buf, buf + 2, 24));
|
||||
}
|
||||
|
||||
TEST(memmove, overlappingForwards_avoidsRunLengthDecodeBehavior) {
|
||||
volatile char buf[32];
|
||||
strcpy(buf, "abc");
|
||||
MoveMemory(buf + 1, buf, 2);
|
||||
ASSERT_STREQ("aaa", buf);
|
||||
strcpy(buf, "abc");
|
||||
(memmove)(buf + 1, buf, 2);
|
||||
ASSERT_STREQ("aab", buf);
|
||||
strcpy(buf, "abcdefghijklmnopqrstuvwxyz");
|
||||
MoveMemory(buf + 2, buf, 24);
|
||||
ASSERT_STREQ("ababababababababababababab", buf);
|
||||
strcpy(buf, "abcdefghijklmnopqrstuvwxyz");
|
||||
memmove(buf + 2, buf, 24);
|
||||
ASSERT_STREQ("ababcdefghijklmnopqrstuvwx", buf);
|
||||
}
|
||||
|
|
|
@ -31,6 +31,7 @@ TEST_LIBC_SOCK_DIRECTDEPS = \
|
|||
LIBC_RUNTIME \
|
||||
LIBC_SOCK \
|
||||
LIBC_STDIO \
|
||||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_SYSV \
|
||||
LIBC_TESTLIB \
|
||||
|
|
|
@ -23,7 +23,15 @@
|
|||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
void *memccpy2(void *, const void *, int, size_t);
|
||||
void *memccpy$pure(void *d, const void *s, int c, size_t n) {
|
||||
size_t i;
|
||||
unsigned char *x;
|
||||
const unsigned char *y;
|
||||
for (c &= 0xff, x = d, y = s, i = 0; i < n; ++i) {
|
||||
if ((x[i] = y[i]) == c) return x + i + 1;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
TEST(memccpy, testStringCopy) {
|
||||
char buf[16];
|
||||
|
@ -49,7 +57,7 @@ TEST(memccpy, memcpy) {
|
|||
b2 = calloc(1, n);
|
||||
b3 = calloc(1, n);
|
||||
rngset(b1, n, rand64, -1);
|
||||
e1 = tinymemccpy(b2, b1, 31337, n);
|
||||
e1 = memccpy$pure(b2, b1, 31337, n);
|
||||
e2 = memccpy(b3, b1, 31337, n);
|
||||
n1 = e1 ? e1 - b2 : n;
|
||||
n2 = e2 ? e2 - b3 : n;
|
||||
|
|
|
@ -18,38 +18,54 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nexgen32e/nexgen32e.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(memcpy, memcpy) {
|
||||
TEST(memcpy, test) {
|
||||
char *b1, *b2;
|
||||
for (unsigned n = 0; n < 1026; ++n) {
|
||||
b1 = malloc(n);
|
||||
b2 = malloc(n);
|
||||
ASSERT_EQ(b1, memcpy(b1, b2, n));
|
||||
rngset(b1, n, rand64, -1);
|
||||
rngset(b2, n, rand64, -1);
|
||||
ASSERT_EQ(b1, memcpy(b1, b2, n), "%ld\n\t%#.*s\n\t%#.*s", n, n, b1, n, b2);
|
||||
ASSERT_EQ(0, memcmp(b1, b2, n));
|
||||
free(b2);
|
||||
free(b1);
|
||||
}
|
||||
for (unsigned n = kHalfCache3 - 1; n < kHalfCache3 + 2; ++n) {
|
||||
b1 = malloc(n);
|
||||
b2 = malloc(n);
|
||||
rngset(b1, n, rand64, -1);
|
||||
rngset(b2, n, rand64, -1);
|
||||
ASSERT_EQ(b1, memcpy(b1, b2, n), "%ld\n\t%#.*s\n\t%#.*s", n, n, b1, n, b2);
|
||||
ASSERT_EQ(0, memcmp(b1, b2, n));
|
||||
free(b2);
|
||||
free(b1);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(memcpy, memcpyDirect) {
|
||||
TEST(mempcpy, test) {
|
||||
char *b1, *b2;
|
||||
for (unsigned n = 0; n < 1026; ++n) {
|
||||
b1 = malloc(n);
|
||||
b2 = malloc(n);
|
||||
ASSERT_EQ(b1, (memcpy)(b1, b2, n));
|
||||
rngset(b1, n, rand64, -1);
|
||||
rngset(b2, n, rand64, -1);
|
||||
ASSERT_EQ(b1 + n, mempcpy(b1, b2, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, n));
|
||||
free(b2);
|
||||
free(b1);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(memcpy, mempcpy) {
|
||||
char *b1, *b2;
|
||||
for (unsigned n = 0; n < 1026; ++n) {
|
||||
for (unsigned n = kHalfCache3 - 1; n < kHalfCache3 + 2; ++n) {
|
||||
b1 = malloc(n);
|
||||
b2 = malloc(n);
|
||||
rngset(b1, n, rand64, -1);
|
||||
rngset(b2, n, rand64, -1);
|
||||
ASSERT_EQ(b1 + n, mempcpy(b1, b2, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, n));
|
||||
free(b2);
|
||||
|
@ -57,11 +73,49 @@ TEST(memcpy, mempcpy) {
|
|||
}
|
||||
}
|
||||
|
||||
TEST(memcpy, mempcpyDirect) {
|
||||
TEST(memcpy, direct) {
|
||||
char *b1, *b2;
|
||||
for (unsigned n = 0; n < 1026; ++n) {
|
||||
b1 = malloc(n);
|
||||
b2 = malloc(n);
|
||||
rngset(b1, n, rand64, -1);
|
||||
rngset(b2, n, rand64, -1);
|
||||
ASSERT_EQ(b1, (memcpy)(b1, b2, n), "%ld\n\t%#.*s\n\t%#.*s", n, n, b1, n,
|
||||
b2);
|
||||
ASSERT_EQ(0, memcmp(b1, b2, n));
|
||||
free(b2);
|
||||
free(b1);
|
||||
}
|
||||
for (unsigned n = kHalfCache3 - 1; n < kHalfCache3 + 2; ++n) {
|
||||
b1 = malloc(n);
|
||||
b2 = malloc(n);
|
||||
rngset(b1, n, rand64, -1);
|
||||
rngset(b2, n, rand64, -1);
|
||||
ASSERT_EQ(b1, (memcpy)(b1, b2, n), "%ld\n\t%#.*s\n\t%#.*s", n, n, b1, n,
|
||||
b2);
|
||||
ASSERT_EQ(0, memcmp(b1, b2, n));
|
||||
free(b2);
|
||||
free(b1);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(mempcpy, direct) {
|
||||
char *b1, *b2;
|
||||
for (unsigned n = 0; n < 1026; ++n) {
|
||||
b1 = malloc(n);
|
||||
b2 = malloc(n);
|
||||
rngset(b1, n, rand64, -1);
|
||||
rngset(b2, n, rand64, -1);
|
||||
ASSERT_EQ(b1 + n, (mempcpy)(b1, b2, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, n));
|
||||
free(b2);
|
||||
free(b1);
|
||||
}
|
||||
for (unsigned n = kHalfCache3 - 1; n < kHalfCache3 + 2; ++n) {
|
||||
b1 = malloc(n);
|
||||
b2 = malloc(n);
|
||||
rngset(b1, n, rand64, -1);
|
||||
rngset(b2, n, rand64, -1);
|
||||
ASSERT_EQ(b1 + n, (mempcpy)(b1, b2, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, n));
|
||||
free(b2);
|
||||
|
@ -105,3 +159,44 @@ TEST(memcpy, testBackwardsOverlap3) {
|
|||
EXPECT_EQ('C', c[1]);
|
||||
free(c);
|
||||
}
|
||||
|
||||
void *MemCpy(void *, const void *, size_t);
|
||||
|
||||
#define B(F, N) \
|
||||
do { \
|
||||
char *d = rngset(malloc(N), N, rand64, -1); \
|
||||
char *s = rngset(malloc(N), N, rand64, -1); \
|
||||
EZBENCH2(#F " " #N, donothing, \
|
||||
EXPROPRIATE(F(VEIL("r", d), VEIL("r", s), N))); \
|
||||
free(d); \
|
||||
free(s); \
|
||||
} while (0)
|
||||
|
||||
#define BB(N) \
|
||||
do { \
|
||||
B(memmove$pure, N); \
|
||||
B(memcpy, N); \
|
||||
B(MemCpy, N); \
|
||||
fprintf(stderr, "\n"); \
|
||||
} while (0)
|
||||
|
||||
BENCH(memcpy, bench) {
|
||||
BB(0);
|
||||
BB(1);
|
||||
BB(2);
|
||||
BB(3);
|
||||
BB(7);
|
||||
BB(8);
|
||||
BB(15);
|
||||
BB(16);
|
||||
BB(31);
|
||||
BB(32);
|
||||
BB(63);
|
||||
BB(64);
|
||||
BB(255);
|
||||
BB(256);
|
||||
BB(1023);
|
||||
BB(1024);
|
||||
BB(PAGESIZE);
|
||||
BB(FRAMESIZE);
|
||||
}
|
||||
|
|
|
@ -17,7 +17,10 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(strchr, blank) {
|
||||
|
@ -66,3 +69,99 @@ TEST(strchrnul, notFound_returnsPointerToNulByte) {
|
|||
EXPECT_STREQ("", strchrnul(buf, 'z'));
|
||||
EXPECT_EQ(&buf[2], strchrnul(buf, 'z'));
|
||||
}
|
||||
|
||||
char *strchr$pure(const char *s, int c) {
|
||||
char *r;
|
||||
for (c &= 0xff;; ++s) {
|
||||
if ((*s & 0xff) == c) return (char *)s;
|
||||
if (!*s) return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
TEST(strchr, fuzz) {
|
||||
char *p;
|
||||
int i, j;
|
||||
p = calloc(1, 64);
|
||||
for (i = -2; i < 257; ++i) {
|
||||
for (j = 0; j < 17; ++j) {
|
||||
rngset(p, 63, rand64, -1);
|
||||
ASSERT_EQ(strchr(p + j, i), strchr$pure(p + j, i));
|
||||
}
|
||||
}
|
||||
free(p);
|
||||
}
|
||||
|
||||
BENCH(strchr, bench) {
|
||||
EZBENCH2("strchr 0", donothing, EXPROPRIATE(strchr(VEIL("r", ""), 0)));
|
||||
EZBENCH2("strchr 5", donothing, EXPROPRIATE(strchr(VEIL("r", "hello"), 'o')));
|
||||
EZBENCH2("strchr 8", donothing,
|
||||
EXPROPRIATE(strchr(VEIL("r", "hellzzzo"), 'o')));
|
||||
EZBENCH2("strchr 17", donothing,
|
||||
EXPROPRIATE(strchr(VEIL("r", "hellzzzhellzzzeeo"), 'o')));
|
||||
EZBENCH2("strchr 34", donothing,
|
||||
EXPROPRIATE(
|
||||
strchr(VEIL("r", "hellzzzhellzzzeeAhellzzzhellzzzeeo"), 'o')));
|
||||
}
|
||||
|
||||
char *memchr$pure(const char *m, int c, size_t n) {
|
||||
const unsigned char *p, *pe;
|
||||
for (c &= 0xff, p = (const unsigned char *)m, pe = p + n; p < pe; ++p) {
|
||||
if (*p == c) return p;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
TEST(memchr, fuzz) {
|
||||
char *p;
|
||||
int i, j;
|
||||
p = malloc(64);
|
||||
for (i = -2; i < 257; ++i) {
|
||||
for (j = 0; j < 17; ++j) {
|
||||
rngset(p, 64, rand64, -1);
|
||||
ASSERT_EQ(memchr(p + j, i, 64 - j), memchr$pure(p + j, i, 64 - j));
|
||||
}
|
||||
}
|
||||
free(p);
|
||||
}
|
||||
|
||||
char *strchrnul$pure(const char *s, int c) {
|
||||
char *r;
|
||||
for (c &= 0xff;; ++s) {
|
||||
if ((*s & 0xff) == c) return (char *)s;
|
||||
if (!*s) return s;
|
||||
}
|
||||
}
|
||||
|
||||
TEST(strchrnul, fuzz) {
|
||||
char *p;
|
||||
int i, j;
|
||||
p = calloc(1, 64);
|
||||
for (i = -2; i < 257; ++i) {
|
||||
for (j = 0; j < 17; ++j) {
|
||||
rngset(p, 63, rand64, -1);
|
||||
ASSERT_EQ(strchrnul(p + j, i), strchrnul$pure(p + j, i));
|
||||
}
|
||||
}
|
||||
free(p);
|
||||
}
|
||||
|
||||
void *rawmemchr$pure(const void *m, int c) {
|
||||
const unsigned char *s;
|
||||
for (c &= 255, s = m;; ++s) {
|
||||
if (*s == c) return s;
|
||||
}
|
||||
}
|
||||
|
||||
TEST(rawmemchr, fuzz) {
|
||||
char *p;
|
||||
int i, j;
|
||||
p = malloc(64);
|
||||
for (i = -2; i < 257; ++i) {
|
||||
for (j = 0; j < 17; ++j) {
|
||||
rngset(p, 63, rand64, -1);
|
||||
p[63] = i;
|
||||
ASSERT_EQ(rawmemchr(p + j, i), rawmemchr$pure(p + j, i));
|
||||
}
|
||||
}
|
||||
free(p);
|
||||
}
|
||||
|
|
|
@ -19,8 +19,10 @@
|
|||
#include "libc/bits/bits.h"
|
||||
#include "libc/macros.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nexgen32e/bsr.h"
|
||||
#include "libc/nexgen32e/tinystrlen.internal.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
@ -30,6 +32,8 @@ char16_t u16[] = u"utf16 ☻";
|
|||
wchar_t u32[] = L"utf32 ☻";
|
||||
|
||||
TEST(strlen, usageExample_c11) {
|
||||
_Alignas(16) char ugh[] = "eeeeeeeeeeeeeee\017";
|
||||
EXPECT_EQ(1, strlen$pure(ugh + 15));
|
||||
EXPECT_EQ(6 + 3, strlen(u8));
|
||||
EXPECT_EQ(7, strlen16(u16));
|
||||
EXPECT_EQ(7, wcslen(u32));
|
||||
|
@ -143,7 +147,7 @@ TEST(strlen, fuzz) {
|
|||
b = rngset(calloc(1, n), n - 1, rand64, -1);
|
||||
n1 = strlen(b);
|
||||
n2 = strlen$pure(b);
|
||||
ASSERT_EQ(n1, n2);
|
||||
ASSERT_EQ(n1, n2, "%#.*s", n, b);
|
||||
n1 = strlen(b + 1);
|
||||
n2 = strlen$pure(b + 1);
|
||||
ASSERT_EQ(n1, n2);
|
||||
|
@ -166,8 +170,14 @@ BENCH(strlen, bench) {
|
|||
EZBENCH2("strlen$pure 8", donothing, strlen$pure_("1234567"));
|
||||
EZBENCH2("strlen 9", donothing, strlen_("12345678"));
|
||||
EZBENCH2("strlen$pure 9", donothing, strlen$pure_("12345678"));
|
||||
EZBENCH2("strlen 11", donothing, strlen_("12345678aa"));
|
||||
EZBENCH2("strlen$pure 11", donothing, strlen$pure_("12345678aa"));
|
||||
EZBENCH2("strlen 13", donothing, strlen_("12345678aabb"));
|
||||
EZBENCH2("strlen$pure 13", donothing, strlen$pure_("12345678aabb"));
|
||||
EZBENCH2("strlen 16", donothing, strlen_("123456781234567"));
|
||||
EZBENCH2("strlen$pure 16", donothing, strlen$pure_("123456781234567"));
|
||||
EZBENCH2("strlen 17", donothing, strlen_("123456781234567e"));
|
||||
EZBENCH2("strlen$pure 17", donothing, strlen$pure_("123456781234567e"));
|
||||
EZBENCH2("strlen 1023", donothing, strlen_(b));
|
||||
EZBENCH2("strlen$pure 1023", donothing, strlen$pure_(b));
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ TEST_LIBC_TINYMATH_DIRECTDEPS = \
|
|||
LIBC_MEM \
|
||||
LIBC_NEXGEN32E \
|
||||
LIBC_RUNTIME \
|
||||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_TESTLIB \
|
||||
LIBC_TINYMATH \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue