mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-05 18:20:34 +00:00
Update safety comments for DataInit.
Previously DataInit did not specify that any implementor `T` must not contain implicit padding, though implementors of DataInit often include a safety statement mentioning that they have no implicit padding. This CL updates DataInit to clarify that any implementor must certify it has no implicit padding to be safe / free of undefined behavior. BUG=none TEST=none (comment only change) Change-Id: Ieddce51949bfa65de65a891deae071a744b0a4ef Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2439301 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Noah Gold <nkgold@google.com>
This commit is contained in:
parent
cf68ea6f3e
commit
b0e9842602
1 changed files with 10 additions and 3 deletions
|
@ -8,11 +8,18 @@ use std::slice::{from_raw_parts, from_raw_parts_mut};
|
|||
|
||||
/// Types for which it is safe to initialize from raw data.
|
||||
///
|
||||
/// A type `T` is `DataInit` if and only if it can be initialized by reading its contents from a
|
||||
/// byte array. This is generally true for all plain-old-data structs. It is notably not true for
|
||||
/// any type that includes a reference.
|
||||
///
|
||||
/// Implementing this trait guarantees that it is safe to instantiate the struct with random data.
|
||||
///
|
||||
/// # Safety
|
||||
/// A type `T` is `DataInit` if it can be initialized by reading its contents from a byte array.
|
||||
/// This is generally true for all plain-old-data structs. It is notably not true for any type
|
||||
/// that includes a reference.
|
||||
///
|
||||
/// It is unsafe for `T` to be `DataInit` if `T` contains implicit padding. (LLVM considers access
|
||||
/// to implicit padding to be undefined behavior, which can cause UB when working with `T`.
|
||||
/// For details on structure padding in Rust, see
|
||||
/// https://doc.rust-lang.org/reference/type-layout.html#the-c-representation
|
||||
pub unsafe trait DataInit: Copy + Send + Sync {
|
||||
/// Converts a slice of raw data into a reference of `Self`.
|
||||
///
|
||||
|
|
Loading…
Reference in a new issue