google/zerocopy

`Ptr` type needs to handle zero-sized types

Opened this issue · 0 comments

Progress

Details

Credit to @djkoloski for noticing this issue.

Currently, the Ptr type's internal invariants require that the pointer point to a valid allocation. However, the ptr module docs imply that zero-sized accesses do not require a pointer to a valid allocation. This is problematic for us, since it implies that Rust could generate a reference to a ZST which does not point to an allocation. Thus, our impl of From<&T> for Ptr<T> might be unsound (albeit in a way that isn't currently exercisable): it promises that, based on the fact that &T is a reference, it must refer to a valid allocation. If T is a ZST, that implication might not hold.

We should do the following:

  • Modify the internal invariants to allow for the pointer to not reference a valid allocation so long as the pointer addresses a byte range of length 0
  • Figure out how to modify the internal invariants regarding provenance: rust-lang/unsafe-code-guidelines#490