ASan 单元测试

SkillDocs & knowledge

Build and run the vlink-test unit tests with AddressSanitizer (ENABLE_TEST_SANITIZE=ON) to reproduce the CI's ASan gate. Use when the user asks to "run asan", "memory detection tests", or troubleshoot sanitize failures in ci-test.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the ASan 单元测试 skill

What this skill tells your AI

The instructions your AI receives, as published by thun-res/vlink in .agents/skills/asan/SKILL.md and read by ahel’s review.

ENABLE_TEST_SANITIZE=ON 时,根 CMakeLists.txtvlink 库目标调用 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. 执行

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

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 专用构建目录):

    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. 构建:

    cmake --build "$BUILD_DIR" --target vlink-test vlink-proxy --parallel "$BUILD_JOBS"
    
  3. 运行测试。复用 CI 脚本,确保先启动测试依赖的 vlink-proxy,并沿用 CI 的超时、并行度和排除规则:

    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_RELbuild-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 条(不主动构建)。

Signals

GitHub stars
115
Forks
10
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
asan-thun-res
Source
github.com/thun-res/vlink