Skip to content

Side-effects of rustrt::at_exit_impl::init should probably not be gated on ::util::ENFORCE_SANITY #16106

Closed
@pnkfelix

Description

@pnkfelix

Here is some code from at_exit_impl.rs:

pub fn init() {
    let state: Box<Queue> = box Exclusive::new(Vec::new());
    unsafe {
        rtassert!(!RUNNING.load(atomics::SeqCst));
        rtassert!(QUEUE.swap(mem::transmute(state), atomics::SeqCst) == 0);
    }
}

The above calls are using the rtassert!(..) macro from macros.rs:

macro_rules! rtassert (
    ( $arg:expr ) => ( {
        if ::util::ENFORCE_SANITY {
            if !$arg {
                rtabort!(" assertion failed: {}", stringify!($arg));
            }
        }
    } )
)

Notably, that macro will only evaluate its argument expressions if ::util::ENFORCE_SANITY is true.

This means that the init() is a no-op if ::util::ENFORCE_SANITY is false. That is probably not what we intended.

We should probably either change the init() code to first run each expression and then pass their return value to the rtassert! macro, or change the rtassert! macro to unconditionally evaluate its argument.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions