From c427d8b21388951718f21f00d9f02da22d9a62f7 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 by failing to compile if pointer size width is 16). 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 e5e25f53f..95a7eb84b 100644 --- a/bitcoin/src/lib.rs +++ b/bitcoin/src/lib.rs @@ -37,12 +37,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 bytes or more. +// +// 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); #[cfg(bench)] extern crate test;