Skip to content

Vec::from_raw_parts docs do not correctly handle empty buffers #119304

@oskgo

Description

@oskgo

Location

https://doc.rust-lang.org/std/vec/struct.Vec.html#method.from_raw_parts

Summary

The docs state the precondition "ptr must have been allocated using the global allocator, such as via the alloc::alloc function", which means that the following code is unsound since Vec::new does not allocate to produce the pointer:

fn reassemble<T>(mut v: Vec<T>) -> Vec<T> {
  let capacity = v.capacity();
  let ptr = v.as_mut_ptr();
  let length = v.len();
  std::mem::forget(v);
  unsafe {Vec::from_raw_parts(ptr, length, capacity)}
}

I believe this to be highly surprising, and probably unintended.

Vec::from_raw_parts should allow ptr not to be obtained from an allocation if capacity times the size of T is zero.

If the documentation is correct InPlaceDstBufDrop is unsound: https://github.com/rust-lang/rust/blob/master/library/alloc/src/vec/in_place_drop.rs#L37

String::from_raw_parts and Vec::from_raw_parts_in have the same issue.

Metadata

Metadata

Assignees

Labels

A-collectionsArea: `std::collections`A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsT-libsRelevant to the library team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions