test_ptr_slow.c (2309B)
1 /* Copyright (c) 2001-2004, Roger Dingledine. 2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 3 * Copyright (c) 2007-2021, The Tor Project, Inc. */ 4 /* See LICENSE for licensing information */ 5 6 #include "orconfig.h" 7 #include "core/or/or.h" 8 #include "test/test.h" 9 #include "test/ptr_helpers.h" 10 11 #include <stdint.h> 12 #include <limits.h> 13 14 /** Assert that <b>a</b> can be cast to void * and back. */ 15 static void 16 assert_int_voidptr_roundtrip(int a) 17 { 18 intptr_t ap = (intptr_t)a; 19 void *b = cast_intptr_to_voidstar(ap); 20 intptr_t c = cast_voidstar_to_intptr(b); 21 void *d = cast_intptr_to_voidstar(c); 22 23 tt_assert(ap == c); 24 tt_assert(b == d); 25 26 done: 27 return; 28 } 29 30 /** Test for possibility of casting `int` to `void *` and back. */ 31 static void 32 test_int_voidstar_interop(void *arg) 33 { 34 int a; 35 (void)arg; 36 37 for (a = -1024; a <= 1024; a++) { 38 assert_int_voidptr_roundtrip(a); 39 } 40 41 for (a = INT_MIN; a <= INT_MIN+1024; a++) { 42 assert_int_voidptr_roundtrip(a); 43 } 44 45 for (a = INT_MAX-1024; a < INT_MAX; a++) { 46 assert_int_voidptr_roundtrip(a); 47 } 48 49 a = 1; 50 for (unsigned long i = 0; i < sizeof(int) * 8; i++) { 51 assert_int_voidptr_roundtrip(a); 52 a = (a << 1); 53 } 54 } 55 56 /** Assert that <b>a</b> can be cast to void * and back. */ 57 static void 58 assert_uint_voidptr_roundtrip(unsigned int a) 59 { 60 uintptr_t ap = (uintptr_t)a; 61 void *b = cast_uintptr_to_voidstar(ap); 62 uintptr_t c = cast_voidstar_to_uintptr(b); 63 void *d = cast_uintptr_to_voidstar(c); 64 65 tt_assert(ap == c); 66 tt_assert(b == d); 67 68 done: 69 return; 70 } 71 72 /** Test for possibility of casting `int` to `void *` and back. */ 73 static void 74 test_uint_voidstar_interop(void *arg) 75 { 76 unsigned int a; 77 (void)arg; 78 79 for (a = 0; a <= 1024; a++) { 80 assert_uint_voidptr_roundtrip(a); 81 } 82 83 for (a = UINT_MAX-1024; a < UINT_MAX; a++) { 84 assert_uint_voidptr_roundtrip(a); 85 } 86 87 a = 1; 88 for (unsigned long i = 0; i < sizeof(int) * 8; i++) { 89 assert_uint_voidptr_roundtrip(a); 90 a = (a << 1); 91 } 92 } 93 94 struct testcase_t slow_ptr_tests[] = { 95 { .name = "int_voidstar_interop", 96 .fn = test_int_voidstar_interop, 97 .flags = 0, 98 .setup = NULL, 99 .setup_data = NULL }, 100 { .name = "uint_voidstar_interop", 101 .fn = test_uint_voidstar_interop, 102 .flags = 0, 103 .setup = NULL, 104 .setup_data = NULL }, 105 END_OF_TESTCASES 106 };