Skip to content

csapp/VALIDATION.md ​

配套源码,运行方法见同目录 README。返回实验总览。

md
# 验证记录

日期:2026-10-04(Asia/Shanghai)。

环境:macOS arm64;Apple clang version 21.0.0;目标 arm64-apple-darwin27.0.0。

执行命令(仓库根目录):

```sh
make -C labs/csapp test
make -C labs/csapp sanitize
```

普通构建选项:`-std=c11 -O2 -g -Wall -Wextra -Wpedantic -Werror`。

Sanitizer 构建选项:`-std=c11 -O1 -g -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined -fno-omit-frame-pointer`。

两次执行均返回 0,无编译诊断与 sanitizer 报告;输出相同:

```text
memory bytes: 78 56 34 12
wrap: 0
bits: boundary checks passed
cache: direct/LRU/cross-block/input checks passed
allocator: split/coalesce/payload checks passed (alignment=8, header=32)
process: child exit=42, reaped without lost wakeup
sync: items=10000 sum=50005000
shell: exec/cd/exit checks passed
CSAPP teaching examples: all checks passed
```

实际覆盖:

- bits:0/全一/高低位组合,旋转 0/1/32,正负有符号边界加法;观察字节序。
- cache:直接映射与 2-way LRU,命中刷新 LRU,M 的两次访问,I 忽略,跨缓存行,零索引/偏移位,非法参数与地址末端溢出。
- allocator:零与 SIZE_MAX 请求、重用与分裂、左右合并、耗尽、4096 字节恢复完整;4000 步固定序列,每步检查全部活跃载荷及块不变量。
- process:单子进程退出 42,经 SIGCHLD 标志唤醒并由父进程回收。
- sync:10000 项逐项顺序检查与最终总和 50005000。
- shell:PATH 命令执行、父进程 cd、更改后的 pwd 与 exit。

未执行:官方 btest/dlc、Bomb/Attack 二进制、test-csim/test-trans、tsh driver、mdriver;Linux ELF 工具演示;ThreadSanitizer;完整 Shell 作业控制;真实缓存性能基准。没有将教学测试通过当作上述项目通过。

限制:这些测试不是所有状态的穷举证明;自建 arena 的内部边界不能完全依靠 ASan 识别,因此附有元数据与用户载荷断言。手动调试器演示与后续扩展练习是学习步骤,不包含在此实测记录中。