mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
feat: 新增 ASan 常设门脚本,批次收尾前跑全 workspace 单测
This commit is contained in:
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
# ASan 常设门:按地址 sanitizer 配方跑全 workspace 单测。
|
||||
#
|
||||
# 用法: scripts/asan_gate.sh
|
||||
# 无参数。nightly 工具链加地址 sanitizer 构建并跑 cargo test --workspace。
|
||||
#
|
||||
# 配方说明:detect_leaks=0 因 PermInterner 与静态表设计性永久泄漏,
|
||||
# 泄漏检测纯噪声;quarantine_size_mb=64 收隔离区,压高并发下内存放大。
|
||||
# RUSTC 指到 asan_rustc_wrapper.sh:仅 oxide_* crate 带 sanitizer 插桩,
|
||||
# 依赖树(含 proc-macro)不带(proc-macro 动态库加载约束,见包装器注释)。
|
||||
#
|
||||
# 退出码: 0 全部通过;1 构建失败或测试失败或 ASan 报告;2 nightly 工具链缺失。
|
||||
|
||||
set -u
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
# 前置检查:nightly 工具链必须已装(rust-toolchain.toml 钉 stable,须显式切换)。
|
||||
if ! RUSTUP_TOOLCHAIN=nightly cargo --version >/dev/null 2>&1; then
|
||||
echo "缺 nightly 工具链:rustup toolchain install nightly" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
export RUSTUP_TOOLCHAIN=nightly
|
||||
export RUSTFLAGS="-Zsanitizer=address"
|
||||
export CARGO_TARGET_DIR=target-asan
|
||||
export ASAN_OPTIONS="detect_leaks=0:quarantine_size_mb=64"
|
||||
# proc-macro 动态库加载进无 ASan 运行时的 rustc 会失败,
|
||||
# 经包装器剥离其 sanitizer 标志(见包装器头部注释)。
|
||||
export RUSTC="$PWD/scripts/asan_rustc_wrapper.sh"
|
||||
|
||||
cargo test --workspace
|
||||
Executable
+61
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env bash
|
||||
# ASan 构建用 rustc 包装器:仅引擎 crate 与最终链接单元带地址 sanitizer 标志。
|
||||
#
|
||||
# 门的目标是检测引擎代码的真实内存错误,故只给 oxide_* 工作区 crate
|
||||
# 插桩,整个依赖树(含 proc-macro)不带 sanitizer 编译。两个原因:
|
||||
# 1. proc-macro 以动态库加载进未带 ASan 运行时的 rustc 进程,
|
||||
# 带 sanitizer 的 proc-macro 动态库加载即失败(未定义 ASan 符号);
|
||||
# 2. proc-macro 动态库把自身依赖(proc-macro2、syn 等)以 rlib 链入,
|
||||
# 只剥 proc-macro 自身的标志不够,ASan 插桩的依赖仍会带进动态库。
|
||||
#
|
||||
# 最终链接单元(--test 测试目标、--crate-type bin 的二进制目标)也要带
|
||||
# 标志:它们链入带插桩的引擎 rlib,须由 rustc 链接 ASan 运行时;
|
||||
# 构建脚本(crate 名 build_script_build)是独立可执行文件,不插桩。
|
||||
#
|
||||
# 用法:常设门把 RUSTC 指到本脚本。按 --crate-name 与编译类型参数裁决,
|
||||
# 保留或剥离 -Zsanitizer=address 后透传给 rustc。
|
||||
|
||||
crate_name=""
|
||||
is_bin=0
|
||||
has_test=0
|
||||
prev=""
|
||||
for a in "$@"; do
|
||||
if [ "$prev" = "--crate-name" ]; then
|
||||
crate_name="$a"
|
||||
fi
|
||||
if [ "$prev" = "--crate-type" ]; then
|
||||
case "$a" in
|
||||
bin) is_bin=1 ;;
|
||||
esac
|
||||
fi
|
||||
case "$a" in
|
||||
--crate-type=bin) is_bin=1 ;;
|
||||
--test) has_test=1 ;;
|
||||
esac
|
||||
prev="$a"
|
||||
done
|
||||
|
||||
keep=0
|
||||
case "$crate_name" in
|
||||
build_script_build) ;;
|
||||
oxide*) keep=1 ;;
|
||||
*)
|
||||
if [ "$is_bin" -eq 1 ] || [ "$has_test" -eq 1 ]; then
|
||||
keep=1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "$keep" -eq 1 ]; then
|
||||
exec rustc "$@"
|
||||
fi
|
||||
|
||||
out=()
|
||||
for a in "$@"; do
|
||||
case "$a" in
|
||||
-Zsanitizer=address) continue ;;
|
||||
esac
|
||||
out+=("$a")
|
||||
done
|
||||
|
||||
exec rustc "${out[@]}"
|
||||
Reference in New Issue
Block a user