secmem_alloc/
macros.rs

1//! Macros used in the crate source.
2
3macro_rules! debug_handleallocerror_precondition {
4    ($condition:expr, $layout:ident) => {
5        mirai_annotations::precondition!($condition);
6        if cfg!(debug_assertions) {
7            // check that `layout` is a valid layout
8            if !($condition) {
9                alloc::alloc::handle_alloc_error($layout);
10            }
11        }
12    };
13}
14
15macro_rules! debug_handleallocerror_precondition_valid_layout {
16    ($layout:ident) => {
17        mirai_annotations::precondition!(
18            core::alloc::Layout::from_size_align($layout.size(), $layout.align()).is_ok(),
19            "invalid layout"
20        );
21        if cfg!(debug_assertions) {
22            // check that `layout` is a valid layout
23            if core::alloc::Layout::from_size_align($layout.size(), $layout.align()).is_err() {
24                alloc::alloc::handle_alloc_error($layout);
25            }
26        }
27    };
28}
29
30macro_rules! precondition_memory_range {
31    ($ptr:expr, $len:expr) => {
32        mirai_annotations::precondition!(!($ptr.is_null()), "null pointer is never valid");
33        mirai_annotations::precondition!(
34            $ptr.addr().checked_add($len).is_some(),
35            "memory range wraps the address space"
36        );
37    };
38}
39
40pub(crate) use {
41    debug_handleallocerror_precondition, debug_handleallocerror_precondition_valid_layout,
42    precondition_memory_range,
43};