crabc 0.7.8

A Rust musl-compatible libc with a dynamic linker
# Redis

**Status: ✅ passes under crabc**

| | |
|---|---|
| Package | `redis-8.4.2-r0` (Alpine 3.23) |
| Version | `Redis server v=8.4.2`, `redis-cli 8.4.2` |
| Baseline | same package with stock musl 1.2.6 |

## What was tested

Redis is a single-threaded event-loop server: `epoll`, timers, sockets,
`fork`, file persistence, and a large amount of string/formatting code.

- `redis-server --version` and `redis-cli --version`;
- daemonized server on port `16379`;
- `PING`, `SET`/`GET`, `INCR`;
- list `RPUSH`/`LRANGE`, hash `HSET`/`HGET`;
- `SAVE` (RDB write), `DBSIZE`, and `SHUTDOWN NOSAVE`.

The server is started with `--save "" --appendonly no` and a fresh RDB file so
the counters are deterministic.

## Commands

```sh
export PATH=/usr/bin:/bin
rm -f /tmp/crabc.rdb
redis-server --version
redis-cli --version
redis-server --port 16379 --daemonize yes --dir /tmp \
  --dbfilename crabc.rdb --save "" --appendonly no
sleep 0.5
redis-cli -p 16379 ping
redis-cli -p 16379 set k hello
redis-cli -p 16379 get k
redis-cli -p 16379 incr counter
redis-cli -p 16379 rpush list a b c
redis-cli -p 16379 lrange list 0 -1
redis-cli -p 16379 hset h f v
redis-cli -p 16379 hget h f
redis-cli -p 16379 save
redis-cli -p 16379 dbsize
redis-cli -p 16379 shutdown nosave
```

## Output under crabc

```text
Redis server v=8.4.2 sha=00000000:1 malloc=libc bits=64 build=%llx
redis-cli 8.4.2
1308735:C 06 Nov 2026 10:16:27.769 # WARNING Memory overcommit must be enabled! \
Without it, a background save or replication may fail under low memory condition. …
PONG
OK
hello
1
3
a b c
1
v
OK
4
REDIS_OK
```

The `vm.overcommit_memory` warning comes from the stock configuration and is
also printed by the musl baseline. The process id and timestamp in the warning
vary per run.

## Baseline comparison

The same replies and the same final `DBSIZE=4`, exit status 0, under musl.

## Notes

- `SAVE` writes an RDB file through `fork` + `write`; the file is readable by
  the subsequent start, which is what the cleanup at the top of the script
  prevents from leaking state between runs.
- Redis is a useful regression test for `epoll_wait`/`epoll_pwait`; the loader
  and libc now use the correct x86\_64 syscall numbers for both.