mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-28 08:12:28 +00:00
Make improvements
- Invent openatemp() API - Invent O_UNLINK open flag - Introduce getenv_secure() API - Remove `git pull` from cosmocc - Fix utimes() when path is NULL - Fix mktemp() to never return NULL - Fix utimensat() UTIME_OMIT on XNU - Improve utimensat() code for RHEL5 - Turn `argv[0]` C:/ to /C/ on Windows - Introduce tmpnam() and tmpnam_r() APIs - Fix more const issues with internal APIs - Permit utimes() on WIN32 in O_RDONLY mode - Fix fdopendir() to check fd is a directory - Fix recent crash regression in landlock make - Fix futimens(AT_FDCWD, NULL) to return EBADF - Use workaround so `make -j` doesn't fork bomb - Rename dontdiscard to __wur (just like glibc) - Fix st_size for WIN32 symlinks containing UTF-8 - Introduce stdio ext APIs needed by GNU coreutils - Fix lstat() on WIN32 for symlinks to directories - Move some constants from normalize.inc to limits.h - Fix segv with memchr() and memcmp() overlapping page - Implement POSIX fflush() behavior for reader streams - Implement AT_SYMLINK_NOFOLLOW for utimensat() on WIN32 - Don't change read-only status of existing files on WIN32 - Correctly handle `0x[^[:xdigit:]]` case in strtol() functions
This commit is contained in:
parent
8596e83cce
commit
f531acc8f9
297 changed files with 1920 additions and 1681 deletions
|
@ -16,11 +16,12 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/intrin/bits.h"
|
||||
#include "libc/intrin/popcnt.h"
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/limits.h"
|
||||
#include "libc/mem/gc.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
|
|
39
test/libc/intrin/memchr_test.c
Normal file
39
test/libc/intrin/memchr_test.c
Normal file
|
@ -0,0 +1,39 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/runtime/sysconf.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/consts/map.h"
|
||||
#include "libc/sysv/consts/prot.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(memchr, test) {
|
||||
const char *s = "hello";
|
||||
ASSERT_EQ(s + 1, memchr(s, 'e', 5));
|
||||
}
|
||||
|
||||
TEST(memchr, pageOverlapTorture) {
|
||||
long pagesz = sysconf(_SC_PAGESIZE);
|
||||
char *map = mmap(0, pagesz * 2, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
ASSERT_SYS(0, 0, mprotect(map + pagesz, pagesz, PROT_NONE));
|
||||
strcpy(map + pagesz - 9, "12345678");
|
||||
EXPECT_EQ(map + pagesz - 1, memchr(map + pagesz - 9, 0, 79));
|
||||
EXPECT_SYS(0, 0, munmap(map, pagesz * 2));
|
||||
}
|
|
@ -18,9 +18,13 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/mem/gc.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/runtime/sysconf.h"
|
||||
#include "libc/stdio/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/consts/map.h"
|
||||
#include "libc/sysv/consts/prot.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/fastrandomstring.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
|
@ -109,100 +113,67 @@ TEST(memcmp, fuzz) {
|
|||
}
|
||||
}
|
||||
|
||||
TEST(memcmp, pageOverlapTorture) {
|
||||
long pagesz = sysconf(_SC_PAGESIZE);
|
||||
char *map = mmap(0, pagesz * 2, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
char *map2 = mmap(0, pagesz * 2, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
ASSERT_SYS(0, 0, mprotect(map + pagesz, pagesz, PROT_NONE));
|
||||
ASSERT_SYS(0, 0, mprotect(map2 + pagesz, pagesz, PROT_NONE));
|
||||
strcpy(map + pagesz - 9, "12345678");
|
||||
strcpy(map2 + pagesz - 9, "12345679");
|
||||
EXPECT_LT(memcmp(map + pagesz - 9, map2 + pagesz - 9, 79), 0);
|
||||
EXPECT_SYS(0, 0, munmap(map2, pagesz * 2));
|
||||
EXPECT_SYS(0, 0, munmap(map, pagesz * 2));
|
||||
}
|
||||
|
||||
int buncmp(const void *, const void *, size_t) asm("bcmp");
|
||||
int funcmp(const void *, const void *, size_t) asm("memcmp");
|
||||
|
||||
#if 0
|
||||
BENCH(bcmp, bench) {
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
b = gc(strdup(b));
|
||||
EZBENCH_N("bcmp", 0, v = buncmp(a, b, 0));
|
||||
EZBENCH_N("bcmp", 1, v = buncmp(a, b, 1));
|
||||
EZBENCH_N("bcmp", 2, v = buncmp(a, b, 2));
|
||||
EZBENCH_N("bcmp", 3, v = buncmp(a, b, 3));
|
||||
EZBENCH_N("𝗯𝗰𝗺𝗽", 4, v = buncmp(a, b, 4));
|
||||
EZBENCH_N("bcmp", 5, v = buncmp(a, b, 5));
|
||||
EZBENCH_N("bcmp", 6, v = buncmp(a, b, 6));
|
||||
EZBENCH_N("bcmp", 7, v = buncmp(a, b, 7));
|
||||
EZBENCH_N("𝗯𝗰𝗺𝗽", 8, v = buncmp(a, b, 8));
|
||||
EZBENCH_N("bcmp", 9, v = buncmp(a, b, 9));
|
||||
EZBENCH_N("bcmp", 15, v = buncmp(a, b, 15));
|
||||
EZBENCH_N("𝗯𝗰𝗺𝗽", 16, v = buncmp(a, b, 16));
|
||||
EZBENCH_N("bcmp", 17, v = buncmp(a, b, 17));
|
||||
EZBENCH_N("bcmp", 31, v = buncmp(a, b, 31));
|
||||
EZBENCH_N("bcmp", 32, v = buncmp(a, b, 32));
|
||||
a = kHyperion;
|
||||
b = gc(strdup(kHyperion));
|
||||
EZBENCH_N("bcmp", 33, v = buncmp(a, b, 33));
|
||||
EZBENCH_N("bcmp", 79, v = buncmp(a, b, 79));
|
||||
EZBENCH_N("𝗯𝗰𝗺𝗽", 80, v = buncmp(a, b, 80));
|
||||
EZBENCH_N("bcmp", 128, v = buncmp(a, b, 128));
|
||||
EZBENCH_N("bcmp", 256, v = buncmp(a, b, 256));
|
||||
a = gc(malloc(16 * 1024));
|
||||
b = gc(malloc(16 * 1024));
|
||||
rngset(a, 16 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 16 * 1024);
|
||||
EZBENCH_N("bcmp", 16384, v = buncmp(a, b, 16384));
|
||||
a = gc(malloc(32 * 1024));
|
||||
b = gc(malloc(32 * 1024));
|
||||
rngset(a, 32 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 32 * 1024);
|
||||
EZBENCH_N("bcmp", 32768, v = buncmp(a, b, 32768));
|
||||
a = gc(malloc(128 * 1024));
|
||||
b = gc(malloc(128 * 1024));
|
||||
rngset(a, 128 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 128 * 1024);
|
||||
EZBENCH_N("bcmp", 131072, v = buncmp(a, b, 131072));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
BENCH(memcmp, bench) {
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
char *volatile a;
|
||||
char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
b = gc(strdup(b));
|
||||
EZBENCH_N("memcmp", 0, v = funcmp(a, b, 0));
|
||||
EZBENCH_N("memcmp", 1, v = funcmp(a, b, 1));
|
||||
EZBENCH_N("memcmp", 2, v = funcmp(a, b, 2));
|
||||
EZBENCH_N("memcmp", 3, v = funcmp(a, b, 3));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 4, v = funcmp(a, b, 4));
|
||||
EZBENCH_N("memcmp", 5, v = funcmp(a, b, 5));
|
||||
EZBENCH_N("memcmp", 6, v = funcmp(a, b, 6));
|
||||
EZBENCH_N("memcmp", 7, v = funcmp(a, b, 7));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 8, v = funcmp(a, b, 8));
|
||||
EZBENCH_N("memcmp", 9, v = funcmp(a, b, 9));
|
||||
EZBENCH_N("memcmp", 15, v = funcmp(a, b, 15));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 16, v = funcmp(a, b, 16));
|
||||
EZBENCH_N("memcmp", 17, v = funcmp(a, b, 17));
|
||||
EZBENCH_N("memcmp", 31, v = funcmp(a, b, 31));
|
||||
EZBENCH_N("memcmp", 32, v = funcmp(a, b, 32));
|
||||
EZBENCH_N("memcmp", 0, __expropriate(funcmp(a, b, 0)));
|
||||
EZBENCH_N("memcmp", 1, __expropriate(funcmp(a, b, 1)));
|
||||
EZBENCH_N("memcmp", 2, __expropriate(funcmp(a, b, 2)));
|
||||
EZBENCH_N("memcmp", 3, __expropriate(funcmp(a, b, 3)));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 4, __expropriate(funcmp(a, b, 4)));
|
||||
EZBENCH_N("memcmp", 5, __expropriate(funcmp(a, b, 5)));
|
||||
EZBENCH_N("memcmp", 6, __expropriate(funcmp(a, b, 6)));
|
||||
EZBENCH_N("memcmp", 7, __expropriate(funcmp(a, b, 7)));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 8, __expropriate(funcmp(a, b, 8)));
|
||||
EZBENCH_N("memcmp", 9, __expropriate(funcmp(a, b, 9)));
|
||||
EZBENCH_N("memcmp", 15, __expropriate(funcmp(a, b, 15)));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 16, __expropriate(funcmp(a, b, 16)));
|
||||
EZBENCH_N("memcmp", 17, __expropriate(funcmp(a, b, 17)));
|
||||
EZBENCH_N("memcmp", 31, __expropriate(funcmp(a, b, 31)));
|
||||
EZBENCH_N("memcmp", 32, __expropriate(funcmp(a, b, 32)));
|
||||
a = kHyperion;
|
||||
b = gc(strdup(kHyperion));
|
||||
EZBENCH_N("memcmp", 33, v = funcmp(a, b, 33));
|
||||
EZBENCH_N("memcmp", 79, v = funcmp(a, b, 79));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 80, v = funcmp(a, b, 80));
|
||||
EZBENCH_N("memcmp", 128, v = funcmp(a, b, 128));
|
||||
EZBENCH_N("memcmp", 256, v = funcmp(a, b, 256));
|
||||
EZBENCH_N("memcmp", 33, __expropriate(funcmp(a, b, 33)));
|
||||
EZBENCH_N("memcmp", 79, __expropriate(funcmp(a, b, 79)));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 80, __expropriate(funcmp(a, b, 80)));
|
||||
EZBENCH_N("memcmp", 128, __expropriate(funcmp(a, b, 128)));
|
||||
EZBENCH_N("memcmp", 256, __expropriate(funcmp(a, b, 256)));
|
||||
a = gc(malloc(16 * 1024));
|
||||
b = gc(malloc(16 * 1024));
|
||||
rngset(a, 16 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 16 * 1024);
|
||||
EZBENCH_N("memcmp", 16384, v = funcmp(a, b, 16384));
|
||||
EZBENCH_N("memcmp", 16384, __expropriate(funcmp(a, b, 16384)));
|
||||
a = gc(malloc(32 * 1024));
|
||||
b = gc(malloc(32 * 1024));
|
||||
rngset(a, 32 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 32 * 1024);
|
||||
EZBENCH_N("memcmp", 32768, v = funcmp(a, b, 32768));
|
||||
EZBENCH_N("memcmp", 32768, __expropriate(funcmp(a, b, 32768)));
|
||||
a = gc(malloc(128 * 1024));
|
||||
b = gc(malloc(128 * 1024));
|
||||
rngset(a, 128 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 128 * 1024);
|
||||
EZBENCH_N("memcmp", 131072, v = funcmp(a, b, 131072));
|
||||
EZBENCH_N("memcmp", 131072, __expropriate(funcmp(a, b, 131072)));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -253,53 +224,6 @@ BENCH(timingsafe_memcmp, bench) {
|
|||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
BENCH(timingsafe_bcmp, bench) {
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
b = gc(strdup(b));
|
||||
EZBENCH_N("timingsafe_bcmp", 0, v = timingsafe_bcmp(a, b, 0));
|
||||
EZBENCH_N("timingsafe_bcmp", 1, v = timingsafe_bcmp(a, b, 1));
|
||||
EZBENCH_N("timingsafe_bcmp", 2, v = timingsafe_bcmp(a, b, 2));
|
||||
EZBENCH_N("timingsafe_bcmp", 3, v = timingsafe_bcmp(a, b, 3));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗯𝗰𝗺𝗽", 4, v = timingsafe_bcmp(a, b, 4));
|
||||
EZBENCH_N("timingsafe_bcmp", 5, v = timingsafe_bcmp(a, b, 5));
|
||||
EZBENCH_N("timingsafe_bcmp", 6, v = timingsafe_bcmp(a, b, 6));
|
||||
EZBENCH_N("timingsafe_bcmp", 7, v = timingsafe_bcmp(a, b, 7));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗯𝗰𝗺𝗽", 8, v = timingsafe_bcmp(a, b, 8));
|
||||
EZBENCH_N("timingsafe_bcmp", 9, v = timingsafe_bcmp(a, b, 9));
|
||||
EZBENCH_N("timingsafe_bcmp", 15, v = timingsafe_bcmp(a, b, 15));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗯𝗰𝗺𝗽", 16, v = timingsafe_bcmp(a, b, 16));
|
||||
EZBENCH_N("timingsafe_bcmp", 17, v = timingsafe_bcmp(a, b, 17));
|
||||
EZBENCH_N("timingsafe_bcmp", 31, v = timingsafe_bcmp(a, b, 31));
|
||||
EZBENCH_N("timingsafe_bcmp", 32, v = timingsafe_bcmp(a, b, 32));
|
||||
a = kHyperion;
|
||||
b = gc(strdup(kHyperion));
|
||||
EZBENCH_N("timingsafe_bcmp", 33, v = timingsafe_bcmp(a, b, 33));
|
||||
EZBENCH_N("timingsafe_bcmp", 79, v = timingsafe_bcmp(a, b, 79));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗯𝗰𝗺𝗽", 80, v = timingsafe_bcmp(a, b, 80));
|
||||
EZBENCH_N("timingsafe_bcmp", 128, v = timingsafe_bcmp(a, b, 128));
|
||||
EZBENCH_N("timingsafe_bcmp", 256, v = timingsafe_bcmp(a, b, 256));
|
||||
a = gc(malloc(16 * 1024));
|
||||
b = gc(malloc(16 * 1024));
|
||||
rngset(a, 16 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 16 * 1024);
|
||||
EZBENCH_N("timingsafe_bcmp", 16384, v = timingsafe_bcmp(a, b, 16384));
|
||||
a = gc(malloc(32 * 1024));
|
||||
b = gc(malloc(32 * 1024));
|
||||
rngset(a, 32 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 32 * 1024);
|
||||
EZBENCH_N("timingsafe_bcmp", 32768, v = timingsafe_bcmp(a, b, 32768));
|
||||
a = gc(malloc(128 * 1024));
|
||||
b = gc(malloc(128 * 1024));
|
||||
rngset(a, 128 * 1024, lemur64, -1);
|
||||
memcpy(b, a, 128 * 1024);
|
||||
EZBENCH_N("timingsafe_bcmp", 131072, v = timingsafe_bcmp(a, b, 131072));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
BENCH(memcasecmp, bench) {
|
||||
volatile int v;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue