---
name: asan
description: >-
  以 AddressSanitizer(ENABLE_TEST_SANITIZE=ON)构建并运行 vlink-test
  单元测试,复现 CI 的 ASan 门禁。用户要求"跑 asan"、"内存检测测试"、
  排查 ci-test 的 sanitize 失败时使用。
---

# ASan 单元测试

`ENABLE_TEST_SANITIZE=ON` 时,根 `CMakeLists.txt` 对 `vlink` 库目标调用
`vlink_test_sanitize()`(`cmake/functions/common.cmake:45`),追加
`-fsanitize=address` 编译与链接选项;随后构建并运行 `vlink-test` 触发
被测库代码。支持 Windows/QNX 之外的 GCC/Clang 目标;不满足条件时会
告警跳过。CI 中只有 Linux job 开启此项
(`.github/workflows/ci-test.yml`)。

## 1. 执行

先从仓库任意子目录解析根目录:

```bash
REPO_ROOT="$(git rev-parse --show-toplevel)"
BUILD_DIR_REL=build-ai/skill_asan
BUILD_DIR="$REPO_ROOT/$BUILD_DIR_REL"
export PYTHONPYCACHEPREFIX="$BUILD_DIR/__pycache__"
PHYSICAL_CORES=
case "$(uname -s 2>/dev/null)" in
  Linux)
    PHYSICAL_CORES="$(
      LC_ALL=C lscpu -p=CORE,SOCKET 2>/dev/null |
        awk -F, '
          $1 !~ /^#/ && $1 ~ /^[0-9]+$/ && $2 ~ /^[0-9]+$/ {
            cores[$2 SUBSEP $1] = 1
          }
          END {
            for (core in cores) {
              count++
            }
            if (count > 0) {
              print count
            }
          }'
    )" || PHYSICAL_CORES=
    ;;
  Darwin)
    PHYSICAL_CORES="$(sysctl -n hw.physicalcpu 2>/dev/null)" || PHYSICAL_CORES=
    ;;
esac
case "$PHYSICAL_CORES" in
  '' | *[!0-9]* | 0) PHYSICAL_CORES=1 ;;
esac
if [ "$PHYSICAL_CORES" -gt 1 ]; then
  BUILD_JOBS=$((PHYSICAL_CORES - 1))
else
  BUILD_JOBS=1
fi
```

1. 配置(AI 专用构建目录):

   ```bash
   cmake -S "$REPO_ROOT" -B "$BUILD_DIR" \
     -DCMAKE_BUILD_TYPE=Release \
     -DENABLE_CXX_STD_20=OFF \
     -DENABLE_TEST=ON \
     -DENABLE_TEST_WARN=ON \
     -DENABLE_TEST_SANITIZE=ON \
     -DENABLE_TEST_COVERAGE=OFF \
     -DENABLE_PROXY=ON \
     -DENABLE_EXAMPLES=OFF
   ```

   配置前确认 Fast DDS 或 Cyclone DDS 可被 CMake 找到。CMake 将
   `ENABLE_PROXY` 改回 OFF 或未生成 `vlink-proxy` target 均为配置
   失败,不得继续测试。

2. 构建:

   ```bash
   cmake --build "$BUILD_DIR" --target vlink-test vlink-proxy --parallel "$BUILD_JOBS"
   ```

3. 运行测试。复用 CI 脚本,确保先启动测试依赖的 `vlink-proxy`,并沿用
   CI 的超时、并行度和排除规则:

   ```bash
   export ASAN_OPTIONS=detect_odr_violation=0
   cd "$REPO_ROOT"
   BUILD_DIR="$BUILD_DIR_REL" bash .github/scripts/run-posix-ci-tests.sh
   ```

## 2. 结果处理

- `detect_odr_violation=0` 是 CI 既有约定(共享库场景误报),不要再额外
  放宽 `ASAN_OPTIONS`。
- `BUILD_JOBS` 必须严格等于 `max(真实物理核心数 - 1, 1)`。禁止改用
  逻辑 CPU 数、裸 `--parallel`/`-j` 或固定高并行度;无法可靠获取物理
  核心数时固定单核,且同一时刻只运行一个本地构建,防止编译卡死或耗尽
  内存。
- 默认 `BUILD_DIR_REL` 为 `build-ai/skill_asan`;正被其他任务使用时先改为
  `build-ai/skill_asan_<task_name>`,再派生 `BUILD_DIR`,不得共用或清理
  其他构建目录。
- ASan 报告(heap-use-after-free、leak、stack-buffer-overflow 等)一律
  按真实缺陷报告;用户同时要求修复时再定位并修改源码,不通过
  suppression 文件消音。
- 只在用户显式调用本 skill 时才执行构建与测试;日常改码流程仍遵循
  `AGENTS.md` 强制规则第 3 条(不主动构建)。
