Skip to content

Implement TryFromBytes for UnsafeCell #905

@joshlf

Description

@joshlf

TODO: Expand based on the following ideas:

  • We can't implement is_bit_valid for UnsafeCell because it requires reading from memory which is behind an UnsafeCell. There's no way to do this without raw pointers, and even with raw pointers, we don't know how other code is accessing the same memory (e.g., it might be using atomics, which would cause UB if we accessed it via non-atomic accesses).
    • We should modify is_bit_valid to have a where Self: NoCell bound.
  • We still want to be able to use TryFromBytes for UnsafeCell.
  • We should add a separate method: TryFromBytes::is_bit_valid_mut. Like is_bit_valid, but its Ptr argument has invariant::Exclusive.
    • We can call this method from try_read_from
  • Inside of the is_bit_valid_mut impl for UnsafeCell, we do the following:
    • Cast to UnsafeCell<Unalign<MaybeValid<T>>> (see below for discussion of MaybeValid)
    • Use Ptr::as_mut to get a &mut UnsafeCell<Unalign<MaybeValid<T>>>
    • Use UnsafeCell::get_mut to get a &mut Unalign<MaybeValid<T>>
    • Delegate to <Unalign<MaybeValid<T>> as TryFromBytes>::is_bit_valid_mut
  • Add MaybeValid<T>, which is just MaybeUninit<T> but with the "as initialized" invariant.

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