tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

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 };