crates/bench/src/mmap_reader.rs 中 install_sigbus_handler() 每次 mmap reader open 时都会无条件执行,并写入 static mut OLD_SIGBUS_HANDLER。crates/bench/src/suites/concurrent.rs 的并发 benchmark 会让多个线程同时调用 B::open(),产生无同步全局写入。
crates/bench/src/mmap_reader.rs
install_sigbus_handler()
static mut OLD_SIGBUS_HANDLER
crates/bench/src/suites/concurrent.rs
B::open()
sigbus_handler
mmap(MAP_FIXED)
crates/bench/src/mmap_reader.rs:26
crates/bench/src/mmap_reader.rs:82
crates/bench/src/suites/concurrent.rs:68
用 OnceLock<Option<SigHandler>> 或 Once 确保 SIGBUS handler 全局只安装一次;优先移除 static mut,在 handler 中通过同步初始化后的只读状态读取 old handler。
OnceLock<Option<SigHandler>>
Once
static mut
经 Oracle 审核后采用 Once + 原始原子变量 方案,消除 static mut UB。
AtomicU8
AtomicPtr
Once::call_once
si_addr
& !0xFFF
test_concurrent_open_installs_handler_once
dad5f5a fix(bench): eliminate SIGBUS handler static mut UB with Once + raw atomics
dad5f5a
No dependencies set.
The note is not visible to the blocked user.
问题
crates/bench/src/mmap_reader.rs中install_sigbus_handler()每次 mmap reader open 时都会无条件执行,并写入static mut OLD_SIGBUS_HANDLER。crates/bench/src/suites/concurrent.rs的并发 benchmark 会让多个线程同时调用B::open(),产生无同步全局写入。影响
static mut OLD_SIGBUS_HANDLER属于 Rust 未定义行为。sigbus_handler自身;若 handler 内mmap(MAP_FIXED)失败,fallback 链式调用会递归调用自身。位置
crates/bench/src/mmap_reader.rs:26crates/bench/src/mmap_reader.rs:82crates/bench/src/suites/concurrent.rs:68建议
用
OnceLock<Option<SigHandler>>或Once确保 SIGBUS handler 全局只安装一次;优先移除static mut,在 handler 中通过同步初始化后的只读状态读取 old handler。修复方案
经 Oracle 审核后采用 Once + 原始原子变量 方案,消除
static mutUB。核心改动 (
crates/bench/src/mmap_reader.rs)static mut OLD_SIGBUS_HANDLER→AtomicU8+AtomicPtrinstall_sigbus_handler()用Once::call_oncesi_addr页对齐& !0xFFF测试
test_concurrent_open_installs_handler_once: 8 线程并发 open 5 种 variant,验证无崩溃commit
dad5f5afix(bench): eliminate SIGBUS handler static mut UB with Once + raw atomics