mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-04-23 00:48:54 +02:00

The only integral types guaranteed by the C standard, if they exist, to support having a pointer cast to them and back are (u)intptr_t. On most architectures, size_t and uintptr_t are typedefs for the same underlying type, so this code ends up working. However, on CHERI, and thus Arm's experimental Morello prototype, C language pointers are implemented with hardware capabilities, which are unforgeable pointers with bounds and permissions. This means that, whilst size_t remains a plain 32/64-bit integer size, (u)intotr_t is represented with a capability. Casting to size_t and back to a pointer causes the capability metadata to be lost and the resulting capability to be invalid, meaning it will trap when dereferenced. Instead, use uintptr_t, and provide fallback definitions for old versions of MSVC like for the other C99 integer types.