@@ -1459,21 +1459,45 @@ test_bson_vector_edge_cases_float32 (void)
1459
1459
static void
1460
1460
test_bson_vector_edge_cases_packed_bit (void )
1461
1461
{
1462
+ // Test UINT32_MAX as an element count. This is the largest representable on systems with a 32-bit size_t.
1463
+ uint32_t len_for_max_count = (uint32_t ) (((uint64_t ) UINT32_MAX + 7u ) / 8u + BSON_VECTOR_HEADER_LEN );
1464
+ {
1465
+ ASSERT_CMPUINT32 (bson_vector_packed_bit_binary_data_length ((size_t ) UINT32_MAX ), = = , len_for_max_count );
1466
+ ASSERT_CMPUINT32 (bson_vector_packed_bit_binary_data_length ((size_t ) UINT32_MAX - 1u ), = = , len_for_max_count );
1467
+ ASSERT_CMPUINT32 (bson_vector_packed_bit_binary_data_length ((size_t ) UINT32_MAX - 6u ), = = , len_for_max_count );
1468
+ ASSERT_CMPUINT32 (
1469
+ bson_vector_packed_bit_binary_data_length ((size_t ) UINT32_MAX - 7u ), = = , len_for_max_count - 1u );
1470
+ ASSERT_CMPUINT32 (
1471
+ bson_vector_packed_bit_binary_data_length ((size_t ) UINT32_MAX - 8u ), = = , len_for_max_count - 1u );
1472
+ }
1473
+
1474
+ // Test the real max_representable_elements only if size_t is large enough.
1475
+ #if SIZE_MAX > UINT32_MAX
1462
1476
size_t max_representable_elements = ((size_t ) UINT32_MAX - BSON_VECTOR_HEADER_LEN ) * 8u ;
1463
1477
1464
1478
// Test binary_data_length (uint32_t) edge cases, without any allocation.
1465
1479
{
1480
+ ASSERT_CMPUINT32 (bson_vector_packed_bit_binary_data_length ((size_t ) UINT32_MAX + 1u ), = = , len_for_max_count );
1481
+ ASSERT_CMPUINT32 (
1482
+ bson_vector_packed_bit_binary_data_length ((size_t ) UINT32_MAX + 2u ), = = , len_for_max_count + 1u );
1483
+ ASSERT_CMPUINT32 (
1484
+ bson_vector_packed_bit_binary_data_length ((size_t ) UINT32_MAX + 9u ), = = , len_for_max_count + 1u );
1466
1485
ASSERT_CMPUINT32 (
1467
1486
bson_vector_packed_bit_binary_data_length (max_representable_elements - 8u ), = = , UINT32_MAX - 1u );
1468
1487
ASSERT_CMPUINT32 (bson_vector_packed_bit_binary_data_length (max_representable_elements - 7u ), = = , UINT32_MAX );
1469
1488
ASSERT_CMPUINT32 (bson_vector_packed_bit_binary_data_length (max_representable_elements ), = = , UINT32_MAX );
1470
1489
ASSERT_CMPUINT32 (bson_vector_packed_bit_binary_data_length (max_representable_elements + 1u ), = = , 0 );
1471
1490
}
1491
+ #endif // SIZE_MAX > UINT32_MAX
1472
1492
1473
- // Needs little real memory because most bytes are never accessed,
1474
- // but we should require a virtual address space larger than 32 bits .
1493
+ // If we additionally have a 64-bit address space, allocate this max-sized vector and run tests.
1494
+ // Needs little real memory because most bytes are never accessed .
1475
1495
#if BSON_WORD_SIZE > 32
1476
1496
1497
+ #if !(SIZE_MAX > UINT32_MAX )
1498
+ #error 64-bit platforms should have a 64-bit size_t
1499
+ #endif
1500
+
1477
1501
size_t expected_bson_overhead =
1478
1502
5 /* empty bson document */ + 3 /* "v" element header */ + 5 /* binary item header */ ;
1479
1503
size_t max_alloc_bytes = (size_t ) BSON_MAX_SIZE - expected_bson_overhead - BSON_VECTOR_HEADER_LEN ;
0 commit comments