🔴 [H1] mmap SIGBUS handler 并发安装会写 static mut 导致 UB #33
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
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