From 2705dd2a5f09440f3cb37cc5223cff6a43c43b47 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Sat, 6 Jul 2024 13:58:57 +1000 Subject: [PATCH] bitcoin: Compile time assert on index size Currently we enforce that our code only runs on machines with a certain pointer width (32 or 64). One of the underlying reasons is because of requirements in consensus code in Bitcoin Core which requires containers with more than 2^16 (65536) items [0]. We can better express our requirements by asserting on Rust's index size (the `usize` type). As a side benefit, there is active work [1] to make Rust support architectures where pointer width != idex size. With this patch applied `rust-bitcoin` will function correctly even if that work progresses. - [0] https://github.com/rust-bitcoin/rust-bitcoin/pull/2929#discussion_r1659399813 - [1] https://github.com/rust-lang/rust/issues/65473 --- bitcoin/src/lib.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/bitcoin/src/lib.rs b/bitcoin/src/lib.rs index eb2295551d..1cc711c043 100644 --- a/bitcoin/src/lib.rs +++ b/bitcoin/src/lib.rs @@ -42,12 +42,19 @@ #![allow(clippy::manual_range_contains)] // More readable than clippy's format. #![allow(clippy::needless_borrows_for_generic_args)] // https://github.com/rust-lang/rust-clippy/issues/12454 -// Disable 16-bit support at least for now as we can't guarantee it yet. -#[cfg(target_pointer_width = "16")] -compile_error!( - "rust-bitcoin currently only supports architectures with pointers wider than 16 bits, let us - know if you want 16-bit support. Note that we do NOT guarantee that we will implement it!" -); +use core::mem; + +// We only support machines with index size of 4 or 8 bytes. +// +// Bitcoin consensus code relies on being able to have containers with more than 65536 (2^16) +// entries in them so we cannot support consensus logic on machines that only have 16-bit memory +// addresses. +// +// We specifically do not use `target_pointer_width` because of the possibility that pointer width +// does not equal index size. +// +// ref: https://github.com/rust-bitcoin/rust-bitcoin/pull/2929#discussion_r1661848565 +internals::const_assert!(mem::size_of::() == 4 || mem::size_of::() == 8); #[cfg(bench)] extern crate test;