tests: require native alignment for C hashes

This commit is contained in:
Adrien Beraud committed 2026-10-27 00:03:07 -04:00
1 parent 13f340694e
commit a09cfefe5e
1 file changed
+21 -12
+21 -12
View File
@@ -12,6 +12,11 @@
#include <gnutls/gnutls.h>
#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);