xref: /qemu/rust/qemu-api/src/zeroable.rs (revision c5f122fdcc280a82e7c5f31de890f985aa7ba773)
16e50bde1SPaolo Bonzini // SPDX-License-Identifier: GPL-2.0-or-later
26e50bde1SPaolo Bonzini 
3ebacd14aSPaolo Bonzini //! Defines a trait for structs that can be safely initialized with zero bytes.
4ebacd14aSPaolo Bonzini 
56e50bde1SPaolo Bonzini /// Encapsulates the requirement that
6bb42965dSPaolo Bonzini /// `MaybeUninit::<Self>::zeroed().assume_init()` does not cause undefined
7*08238372SPaolo Bonzini /// behavior.
86e50bde1SPaolo Bonzini ///
96e50bde1SPaolo Bonzini /// # Safety
106e50bde1SPaolo Bonzini ///
11*08238372SPaolo Bonzini /// Do not add this trait to a type unless all-zeroes is a valid value for the
12*08238372SPaolo Bonzini /// type.  In particular, raw pointers can be zero, but references and
13*08238372SPaolo Bonzini /// `NonNull<T>` cannot.
146e50bde1SPaolo Bonzini pub unsafe trait Zeroable: Default {
15*08238372SPaolo Bonzini     /// Return a value of Self whose memory representation consists of all
16*08238372SPaolo Bonzini     /// zeroes, with the possible exclusion of padding bytes.
17*08238372SPaolo Bonzini     const ZERO: Self = unsafe { ::core::mem::MaybeUninit::<Self>::zeroed().assume_init() };
18bb42965dSPaolo Bonzini }
19bb42965dSPaolo Bonzini 
202537f830SPaolo Bonzini // bindgen does not derive Default here
212537f830SPaolo Bonzini #[allow(clippy::derivable_impls)]
222537f830SPaolo Bonzini impl Default for crate::bindings::VMStateFlags {
default() -> Self232537f830SPaolo Bonzini     fn default() -> Self {
242537f830SPaolo Bonzini         Self(0)
252537f830SPaolo Bonzini     }
262537f830SPaolo Bonzini }
272537f830SPaolo Bonzini 
28*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::Property__bindgen_ty_1 {}
29*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::Property {}
30*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::VMStateFlags {}
31*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::VMStateField {}
32*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::VMStateDescription {}
33*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::MemoryRegionOps__bindgen_ty_1 {}
34*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::MemoryRegionOps__bindgen_ty_2 {}
35*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::MemoryRegionOps {}
36*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::MemTxAttrs {}
37*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::CharBackend {}
38