From a09cfefe5e902c268e0d9b9b1458bbdb0de3cae4 Mon Sep 17 00:00:00 2001 From: Adrien Beraud Date: Mon, 26 Oct 2026 23:41:06 -0400 Subject: [PATCH] tests: require native alignment for C hashes --- tests/test_c.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/tests/test_c.c b/tests/test_c.c index 8dba5a88..806a2d24 100644 --- a/tests/test_c.c +++ b/tests/test_c.c @@ -12,6 +12,11 @@ #include #endif +_Static_assert(_Alignof(dht_infohash) == _Alignof(uint32_t), "InfoHash alignment must match uint32_t"); +_Static_assert(_Alignof(dht_pkid) == _Alignof(uint32_t), "PkId alignment must match uint32_t"); +_Static_assert(sizeof(dht_infohash) == HASH_LEN, "InfoHash size must remain unchanged"); +_Static_assert(sizeof(dht_pkid) == 32, "PkId size must remain unchanged"); + static void done_cb(bool ok, void* user_data) { @@ -66,20 +71,24 @@ main(void) assert(memcmp(&hash, &restored, sizeof(hash)) == 0); struct { - uint32_t alignment; uint8_t prefix; dht_infohash hash; - } unaligned = {0}; - dht_infohash_get_from_string(&unaligned.hash, "abc"); - assert(!dht_infohash_is_zero(&unaligned.hash)); - assert(strcmp(dht_infohash_print(&unaligned.hash), "a9993e364706816aba3e25717850c26c9cd0d89d") == 0); - dht_infohash_from_hex_null(&unaligned.hash, "a9993e364706816aba3e25717850c26c9cd0d89d"); - dht_infohash_from_hex(&restored, dht_infohash_print(&unaligned.hash)); - assert(memcmp(&unaligned.hash, &restored, sizeof(restored)) == 0); - dht_infohash_zero(&unaligned.hash); - assert(dht_infohash_is_zero(&unaligned.hash)); - dht_infohash_random(&unaligned.hash); - assert(!dht_infohash_is_zero(&unaligned.hash)); + dht_pkid pkid; + } embedded = {0}; + assert((uintptr_t) &embedded.hash % _Alignof(uint32_t) == 0); + assert((uintptr_t) &embedded.pkid % _Alignof(uint32_t) == 0); + dht_infohash_get_from_string(&embedded.hash, "abc"); + assert(!dht_infohash_is_zero(&embedded.hash)); + assert(strcmp(dht_infohash_print(&embedded.hash), "a9993e364706816aba3e25717850c26c9cd0d89d") == 0); + dht_infohash_from_hex_null(&embedded.hash, "a9993e364706816aba3e25717850c26c9cd0d89d"); + dht_infohash_from_hex(&restored, dht_infohash_print(&embedded.hash)); + assert(memcmp(&embedded.hash, &restored, sizeof(restored)) == 0); + dht_infohash_zero(&embedded.hash); + assert(dht_infohash_is_zero(&embedded.hash)); + dht_infohash_random(&embedded.hash); + assert(!dht_infohash_is_zero(&embedded.hash)); + assert(strcmp(dht_pkid_print(&embedded.pkid), + "0000000000000000000000000000000000000000000000000000000000000000") == 0); dht_value* value = dht_value_with_id_new(invalid, sizeof(invalid), 42); assert(value != NULL);