evmar / n2

n2 ("into"), a ninja compatible build system
Apache License 2.0
321 stars 24 forks source link

mutable reference to mutable static detected bu rustc #114

Open Young-Flash opened 3 months ago

Young-Flash commented 3 months ago

Thanks for the great project.

I am using rustc 1.77.2, when I run cargo test, it warnning:

warning: creating a mutable reference to mutable static is discouraged
   --> src/trace.rs:104:15
    |
104 |         match &mut TRACE {
    |               ^^^^^^^^^^ mutable reference to mutable static
    |
    = note: for more information, see issue #114447 <https://github.com/rust-lang/rust/issues/114447>
    = note: this will be a hard error in the 2024 edition
    = note: this mutable reference has lifetime `'static`, but if the static gets accessed (read or written) by any other means, or any other reference is created, then any further use of this mutable reference is Undefined Behavior
    = note: `#[warn(static_mut_refs)]` on by default
help: use `addr_of_mut!` instead to create a raw pointer

the code could be refactor to:

use std::ptr::addr_of_mut;

match *addr_of_mut!(TRACE) {
    None => {}
    Some(ref mut t) => f(t),
}

if it's ok with you, I'd like to make a PR

evmar commented 3 months ago

Thanks for filing this!

Looking at the bug in the error message, they mention how you can't just then dereference the pointer and need to"[make] sure that the reference stops being used before a second reference is created". In reviewing this code, I think we do not do this, because multiple trace::scope()s will be nested.

I think the proper fix would be to remove the callbacks from if_enabled and scope so that it's impossible to use incorrectly.