Skip to content

Commit

Permalink
Auto merge of #79045 - oli-obk:dont_rely_on_alloc_happening_for_sound…
Browse files Browse the repository at this point in the history
…ness, r=TimDiekmann

Document that heap allocations are not guaranteed to happen, even if explicitly performed in the code

cc `@RalfJung`
  • Loading branch information
bors committed Dec 26, 2020
2 parents 89524d0 + efcd8a9 commit 0b644e4
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions library/core/src/alloc/global.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,27 @@ use crate::ptr;
/// * `Layout` queries and calculations in general must be correct. Callers of
/// this trait are allowed to rely on the contracts defined on each method,
/// and implementors must ensure such contracts remain true.
///
/// * You may not rely on allocations actually happening, even if there are explicit
/// heap allocations in the source. The optimizer may detect unused allocations that it can either
/// eliminate entirely or move to the stack and thus never invoke the allocator. The
/// optimizer may further assume that allocation is infallible, so code that used to fail due
/// to allocator failures may now suddenly work because the optimizer worked around the
/// need for an allocation. More concretely, the following code example is unsound, irrespective
/// of whether your custom allocator allows counting how many allocations have happened.
///
/// ```rust,ignore (unsound and has placeholders)
/// drop(Box::new(42));
/// let number_of_heap_allocs = /* call private allocator API */;
/// unsafe { std::intrinsics::assume(number_of_heap_allocs > 0); }
/// ```
///
/// Note that the optimizations mentioned above are not the only
/// optimization that can be applied. You may generally not rely on heap allocations
/// happening if they can be removed without changing program behavior.
/// Whether allocations happen or not is not part of the program behavior, even if it
/// could be detected via an allocator that tracks allocations by printing or otherwise
/// having side effects.
#[stable(feature = "global_alloc", since = "1.28.0")]
pub unsafe trait GlobalAlloc {
/// Allocate memory as described by the given `layout`.
Expand Down

0 comments on commit 0b644e4

Please sign in to comment.