1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <cstdio>
#include <cinttypes>
//#if (sizeof(void *) == sizeof(uint32_t))
typedef uint32_t ptr_equiv;
//#elif (sizeof(void *) == sizeof(uint64_t))
//typedef uint64_t ptr_equiv;
//#else
//#error "Unknown ptr size"
//#endif
inline void * ptrGetAddr(void * ptr)
{
return reinterpret_cast<void *>(reinterpret_cast<ptr_equiv>(ptr) & ~1U);
}
inline void * ptrSetAddr(void * ptr, void * addr)
{
return reinterpret_cast<void *>((reinterpret_cast<ptr_equiv>(addr) & ~1U) |
(reinterpret_cast<ptr_equiv>(ptr) & 1U));
}
inline bool ptrGetBool(void * ptr)
{
return reinterpret_cast<ptr_equiv>(ptr) & 1U;
}
inline void * ptrSetBool(void * ptr, bool b)
{
return reinterpret_cast<void *>((reinterpret_cast<ptr_equiv>(ptr) & ~1U) |
( b & 1U));
}
int main(int argc, char **argv)
{
void * ptr = 0;
ptr = ptrSetAddr(ptr, (void *)0xCAFEDECA);
fprintf(stdout, "%p\n", ptr);
ptr = ptrSetBool(ptr, 1);
fprintf(stdout, "%p\n", ptr);
ptr = ptrSetBool(ptr, 0);
fprintf(stdout, "%p\n", ptr);
ptr = ptrSetBool(ptr, 1);
fprintf(stdout, "%p\n", ptr);
fprintf(stdout, "%p\n", ptrGetAddr(ptr));
fprintf(stdout, "%d\n", ptrGetBool(ptr));
return 0;
} |
Partager