Coverage Report

Created: 2026-06-08 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.4.2/src/lib.rs
Line
Count
Source
1
// Overwrite links to crate items with intra-crate links
2
//! [`Error::UNEXPECTED`]: Error::UNEXPECTED
3
//! [`fill_uninit`]: fill_uninit
4
5
#![no_std]
6
#![doc(
7
    html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png",
8
    html_favicon_url = "https://www.rust-lang.org/favicon.ico"
9
)]
10
#![doc = include_str!("../README.md")]
11
#![cfg_attr(docsrs, feature(doc_cfg))]
12
#![cfg_attr(getrandom_backend = "efi_rng", feature(uefi_std))]
13
#![cfg_attr(getrandom_backend = "extern_impl", feature(extern_item_impls))]
14
15
#[macro_use]
16
extern crate cfg_if;
17
18
use core::mem::MaybeUninit;
19
20
mod backends;
21
mod error;
22
mod util;
23
24
#[cfg(feature = "std")]
25
mod error_std_impls;
26
27
/// `rand_core` adapter
28
#[cfg(feature = "sys_rng")]
29
mod sys_rng;
30
31
#[cfg(feature = "sys_rng")]
32
pub use rand_core;
33
#[cfg(feature = "sys_rng")]
34
pub use sys_rng::SysRng;
35
36
pub use crate::error::{Error, RawOsError};
37
38
/// Attribute macros for overwriting the core functionality of this crate.
39
///
40
/// This allows `getrandom` to provide a default implementation and a common interface
41
/// for all crates to use, while giving users a safe way to override that default where required.
42
///
43
/// Must be enabled via the `extern_impl` opt-in backend, as this functionality
44
/// is currently limited to nightly.
45
///
46
/// # Examples
47
///
48
/// ```rust
49
/// # use core::mem::MaybeUninit;
50
/// # #[cfg(getrandom_backend = "extern_impl")]
51
/// #[getrandom::implementation::fill_uninit]
52
/// fn my_fill_uninit_implementation(
53
///     dest: &mut [MaybeUninit<u8>]
54
/// ) -> Result<(), getrandom::Error> {
55
///     // ...
56
/// #   let _ = dest;
57
/// #   Err(Error::UNSUPPORTED)
58
/// }
59
/// ```
60
#[cfg(getrandom_backend = "extern_impl")]
61
pub mod implementation {
62
    pub use crate::backends::extern_impl::{fill_uninit, u32, u64};
63
}
64
65
/// Fill `dest` with random bytes from the system's preferred random number source.
66
///
67
/// This function returns an error on any failure, including partial reads. We
68
/// make no guarantees regarding the contents of `dest` on error. If `dest` is
69
/// empty, `getrandom` immediately returns success, making no calls to the
70
/// underlying operating system.
71
///
72
/// Blocking is possible, at least during early boot; see module documentation.
73
///
74
/// In general, `getrandom` will be fast enough for interactive usage, though
75
/// significantly slower than a user-space CSPRNG; for the latter consider
76
/// [`rand::thread_rng`](https://docs.rs/rand/*/rand/fn.thread_rng.html).
77
///
78
/// # Examples
79
///
80
/// ```
81
/// # fn main() -> Result<(), getrandom::Error> {
82
/// let mut buf = [0u8; 32];
83
/// getrandom::fill(&mut buf)?;
84
/// # Ok(()) }
85
/// ```
86
#[inline]
87
0
pub fn fill(dest: &mut [u8]) -> Result<(), Error> {
88
    // SAFETY: The `&mut MaybeUninit<_>` reference doesn't escape,
89
    // and `fill_uninit` guarantees it will never de-initialize
90
    // any part of `dest`.
91
0
    fill_uninit(unsafe { util::slice_as_uninit_mut(dest) })?;
92
0
    Ok(())
93
0
}
94
95
/// Fill potentially uninitialized buffer `dest` with random bytes from
96
/// the system's preferred random number source and return a mutable
97
/// reference to those bytes.
98
///
99
/// On successful completion this function is guaranteed to return a slice
100
/// which points to the same memory as `dest` and has the same length.
101
/// In other words, it's safe to assume that `dest` is initialized after
102
/// this function has returned `Ok`.
103
///
104
/// No part of `dest` will ever be de-initialized at any point, regardless
105
/// of what is returned.
106
///
107
/// # Examples
108
///
109
/// ```ignore
110
/// # // We ignore this test since `uninit_array` is unstable.
111
/// #![feature(maybe_uninit_uninit_array)]
112
/// # fn main() -> Result<(), getrandom::Error> {
113
/// let mut buf = core::mem::MaybeUninit::uninit_array::<1024>();
114
/// let buf: &mut [u8] = getrandom::fill_uninit(&mut buf)?;
115
/// # Ok(()) }
116
/// ```
117
#[inline]
118
0
pub fn fill_uninit(dest: &mut [MaybeUninit<u8>]) -> Result<&mut [u8], Error> {
119
0
    if !dest.is_empty() {
120
0
        backends::fill_inner(dest)?;
121
0
    }
122
123
    #[cfg(getrandom_msan)]
124
    unsafe extern "C" {
125
        fn __msan_unpoison(a: *mut core::ffi::c_void, size: usize);
126
    }
127
128
    // SAFETY: `dest` has been fully initialized by `imp::fill_inner`
129
    // since it returned `Ok`.
130
0
    Ok(unsafe { util::slice_assume_init_mut(dest) })
131
0
}
Unexecuted instantiation: getrandom::fill_uninit
Unexecuted instantiation: getrandom::fill_uninit
132
133
/// Get random `u32` from the system's preferred random number source.
134
///
135
/// # Examples
136
///
137
/// ```
138
/// # fn main() -> Result<(), getrandom::Error> {
139
/// let rng_seed = getrandom::u32()?;
140
/// # Ok(()) }
141
/// ```
142
#[inline]
143
0
pub fn u32() -> Result<u32, Error> {
144
0
    backends::inner_u32()
145
0
}
146
147
/// Get random `u64` from the system's preferred random number source.
148
///
149
/// # Examples
150
///
151
/// ```
152
/// # fn main() -> Result<(), getrandom::Error> {
153
/// let rng_seed = getrandom::u64()?;
154
/// # Ok(()) }
155
/// ```
156
#[inline]
157
0
pub fn u64() -> Result<u64, Error> {
158
0
    backends::inner_u64()
159
0
}
Unexecuted instantiation: getrandom::u64
Unexecuted instantiation: getrandom::u64