#3377·napi-rs

`SendableResolver<Data, R>` 的 `Send` 实现不合理

作者: Manishearth创建于 2026年7月5日更新于 2026年7月5日
Minimal Reproduction (Miri)
rust
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