`SendableResolver<Data, R>` 的 `Send` 实现不合理
作者: Manishearth创建于 2026年7月5日更新于 2026年7月5日
Minimal Reproduction (Miri)
use std::rc::Rc;
use std::thread;
use napi::{sys, Result, SendableResolver};
fn main() {
let rc = Rc::new(42);
let rc_clone = rc.clone();
let resolver = SendableResolver::new(move |_env: sys::napi_env, _data: ()| -> Result<sys::napi_value> {
let _val = *rc_clone;
Ok(std::ptr::null_mut())
});
let handle = thread::spawn(move || {
drop(resolver);
});
let _rc_clone2 = rc.clone();
let _ = handle.join();
}error: Undefined Behavior: Data race detected between (1) non-atomic write on thread `main` and (2) non-atomic read on thread `unnamed-1` at alloc199
--> /usr/local/google/home/manishearth/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/ZZTERM10ZZ/library/core/src/cell.rs:555:18
| unsafe { *self.value.get() }
| ^^^^^^^^^^^^^^^^^ (2) just happened here
|
help: and (1) occurred earlier here
--> src/bin/repro1.rs:17:22
|
17 | let _rc_clone2 = rc.clone();
| ^^^^^^^^^^
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
= help: see https://doc.ZZTERM11ZZ-lang.org/nightly/reference/behavior-considered-undefined.html for further information
= note: this is on thread `unnamed-1`
= note: stack backtrace:
0: std::cell::Cell::<usize>::get
at /usr/local/google/home/manishearth/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/ZZTERM12ZZ/library/core/src/cell.rs:555:18: 555:35
1: <std::rc::RcInner<i32> as std::rc::RcInnerPtr>::strong
at /usr/local/google/home/manishearth/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/ZZTERM13ZZ/library/alloc/src/rc.rs:3759:9: 3759:32
2: <std::rc::RcInner<i32> as std::rc::RcInnerPtr>::dec_strong
at
…内容来源: napi-rs/napi-rs