Skip to content

Possible Unsafe Memory Access Without Safety Justification in node_vec.rs #16

@yaokunzhang

Description

@yaokunzhang

Issue Summary

Thank you for appreciating this excellent open-source project.
Our static analysis tool has identified potential safety issues in the node_vec.rs file. The node_vec.rs file contains potentially unsafe code patterns that bypass Rust’s safety guarantees without appropriate justification or documentation. These issues were detected by a static analysis tool and are primarily located in the non_null_node and make_node functions.

Details

non_null_node Function:

pub(crate) fn non_null_node(&self, index: usize) -> NonNull<Node<T>> {
    unsafe {
        NonNull::new_unchecked(
            self.buf.get_unchecked(index)
                .try_borrow_unguarded()
                .unwrap() as *const Node<T> as *mut Node<T>
        )
    }
}

Uses get_unchecked to bypass bounds checking

make_node Function:

pub(crate) fn make_node(
    &mut self,
    parent: Option<NonNull<Node<T>>>,
    index: usize,
    data: Data<T>,
    size: Size
) -> NonNull<Node<T>> {
    unsafe {
        let node = self.buf.get_unchecked_mut(index);
        // ...
    }
}

Uses get_unchecked_mut to skip bounds checking

Recommendation

To ensure memory safety and uphold Rust’s safety principles:

  • Consider marking these functions as unsafe fn if the caller must uphold certain invariants.
  • Add detailed documentation comments explaining the safety requirements for these functions.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions