Skip to content

Commit ffd73df

Browse files
committed
avoid mem::uninitialized in BTreeMap
1 parent a88414e commit ffd73df

File tree

3 files changed

+18
-10
lines changed

3 files changed

+18
-10
lines changed

src/liballoc/collections/btree/node.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ struct InternalNode<K, V> {
145145

146146
/// The pointers to the children of this node. `len + 1` of these are considered
147147
/// initialized and valid.
148-
edges: [BoxedNode<K, V>; 2 * B],
148+
edges: [MaybeUninit<BoxedNode<K, V>>; 2 * B],
149149
}
150150

151151
impl<K, V> InternalNode<K, V> {
@@ -159,7 +159,10 @@ impl<K, V> InternalNode<K, V> {
159159
unsafe fn new() -> Self {
160160
InternalNode {
161161
data: LeafNode::new(),
162-
edges: mem::uninitialized()
162+
// Creating a `[MaybeUninit; N]` array by first creating a
163+
// `MaybeUninit<[MaybeUninit; N]>`; the `into_inner` is safe because the inner
164+
// array does not require initialization.
165+
edges: MaybeUninit::uninitialized().into_inner(),
163166
}
164167
}
165168
}
@@ -261,7 +264,7 @@ impl<K, V> Root<K, V> {
261264
-> NodeRef<marker::Mut, K, V, marker::Internal> {
262265
debug_assert!(!self.is_shared_root());
263266
let mut new_node = Box::new(unsafe { InternalNode::new() });
264-
new_node.edges[0] = unsafe { BoxedNode::from_ptr(self.node.as_ptr()) };
267+
new_node.edges[0].set(unsafe { BoxedNode::from_ptr(self.node.as_ptr()) });
265268

266269
self.node = BoxedNode::from_internal(new_node);
267270
self.height += 1;
@@ -718,7 +721,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
718721
unsafe {
719722
ptr::write(self.keys_mut().get_unchecked_mut(idx), key);
720723
ptr::write(self.vals_mut().get_unchecked_mut(idx), val);
721-
ptr::write(self.as_internal_mut().edges.get_unchecked_mut(idx + 1), edge.node);
724+
self.as_internal_mut().edges.get_unchecked_mut(idx + 1).set(edge.node);
722725

723726
(*self.as_leaf_mut()).len += 1;
724727

@@ -749,7 +752,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
749752
slice_insert(self.vals_mut(), 0, val);
750753
slice_insert(
751754
slice::from_raw_parts_mut(
752-
self.as_internal_mut().edges.as_mut_ptr(),
755+
MaybeUninit::first_mut_ptr(&mut self.as_internal_mut().edges),
753756
self.len()+1
754757
),
755758
0,
@@ -778,7 +781,9 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
778781
let edge = match self.reborrow_mut().force() {
779782
ForceResult::Leaf(_) => None,
780783
ForceResult::Internal(internal) => {
781-
let edge = ptr::read(internal.as_internal().edges.get_unchecked(idx + 1));
784+
let edge = ptr::read(
785+
internal.as_internal().edges.get_unchecked(idx + 1).as_ptr()
786+
);
782787
let mut new_root = Root { node: edge, height: internal.height - 1 };
783788
(*new_root.as_mut().as_leaf_mut()).parent = ptr::null();
784789
Some(new_root)
@@ -806,7 +811,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
806811
ForceResult::Internal(mut internal) => {
807812
let edge = slice_remove(
808813
slice::from_raw_parts_mut(
809-
internal.as_internal_mut().edges.as_mut_ptr(),
814+
MaybeUninit::first_mut_ptr(&mut internal.as_internal_mut().edges),
810815
old_len+1
811816
),
812817
0
@@ -1085,7 +1090,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
10851090

10861091
slice_insert(
10871092
slice::from_raw_parts_mut(
1088-
self.node.as_internal_mut().edges.as_mut_ptr(),
1093+
MaybeUninit::first_mut_ptr(&mut self.node.as_internal_mut().edges),
10891094
self.node.len()
10901095
),
10911096
self.idx + 1,
@@ -1140,7 +1145,9 @@ impl<BorrowType, K, V>
11401145
pub fn descend(self) -> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
11411146
NodeRef {
11421147
height: self.node.height - 1,
1143-
node: unsafe { self.node.as_internal().edges.get_unchecked(self.idx).as_ptr() },
1148+
node: unsafe {
1149+
self.node.as_internal().edges.get_unchecked(self.idx).get_ref().as_ptr()
1150+
},
11441151
root: self.node.root,
11451152
_marker: PhantomData
11461153
}

src/liballoc/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
#![no_std]
6464
#![needs_allocator]
6565

66+
#![warn(deprecated_in_future)]
6667
#![deny(intra_doc_link_resolution_failure)]
6768
#![deny(missing_debug_implementations)]
6869

src/libcore/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@
5858
issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/",
5959
test(no_crate_inject, attr(deny(warnings))),
6060
test(attr(allow(dead_code, deprecated, unused_variables, unused_mut))))]
61-
6261
#![no_core]
62+
6363
#![warn(deprecated_in_future)]
6464
#![deny(missing_docs)]
6565
#![deny(intra_doc_link_resolution_failure)]

0 commit comments

Comments
 (0)