From e8f7de804221302c72084bd27825dcc0ae2ad445 Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Wed, 17 Jun 2026 20:00:39 -0700 Subject: [PATCH] fix: avoid u32 overflow in statistics for full bitmaps Signed-off-by: Sai Asish Y --- roaring/src/bitmap/statistics.rs | 8 ++++---- roaring/tests/lib.rs | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/roaring/src/bitmap/statistics.rs b/roaring/src/bitmap/statistics.rs index 2869c42fd..15672ab46 100644 --- a/roaring/src/bitmap/statistics.rs +++ b/roaring/src/bitmap/statistics.rs @@ -18,9 +18,9 @@ pub struct Statistics { /// Number of bitset containers in the bitmap pub n_bitset_containers: u32, /// Number of values stored in array containers - pub n_values_array_containers: u32, + pub n_values_array_containers: u64, /// Number of values stored in run containers - pub n_values_run_containers: u32, + pub n_values_run_containers: u64, /// Number of values stored in bitset containers pub n_values_bitset_containers: u64, /// Number of bytes used by array containers @@ -77,7 +77,7 @@ impl RoaringBitmap { match store { Store::Array(array) => { cardinality += array.len(); - n_values_array_containers += array.len() as u32; + n_values_array_containers += array.len(); n_bytes_array_containers += (array.capacity() * mem::size_of::()) as u64; n_array_containers += 1; } @@ -89,7 +89,7 @@ impl RoaringBitmap { } Store::Run(runs) => { cardinality += runs.len(); - n_values_run_containers += runs.len() as u32; + n_values_run_containers += runs.len(); n_bytes_run_containers += runs.byte_size() as u64; n_run_containers += 1; } diff --git a/roaring/tests/lib.rs b/roaring/tests/lib.rs index 568de01d7..c16e3e673 100644 --- a/roaring/tests/lib.rs +++ b/roaring/tests/lib.rs @@ -150,3 +150,11 @@ fn optimize_run() { // Calling optimize a second time should return false as no changes will be made assert!(!bitmap.optimize()); } + +#[test] +fn statistics_full_run() { + let stats = RoaringBitmap::full().statistics(); + let expected: u64 = 1 << 32; + assert_eq!(stats.cardinality, expected); + assert_eq!(u64::from(stats.n_values_run_containers), expected); +}