about summary refs log tree commit diff
path: root/src/tools/miri/tests/native-lib/ptr_read_access.c
blob: 021eb6adca4f60a58ee9bdb5c20affa9d9a15882 (plain)
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
53
54
55
56
57
#include <stdio.h>
#include <stdint.h>

// See comments in build_native_lib()
#define EXPORT __attribute__((visibility("default")))

/* Test: test_access_pointer */

EXPORT void print_pointer(const int32_t *ptr) {
  printf("printing pointer dereference from C: %d\n", *ptr);
}

/* Test: test_access_simple */

typedef struct Simple {
  int32_t field;
} Simple;

EXPORT int32_t access_simple(const Simple *s_ptr) {
  return s_ptr->field;
}

/* Test: test_access_nested */

typedef struct Nested {
  int32_t value;
  struct Nested *next;
} Nested;

// Returns the innermost/last value of a Nested pointer chain.
EXPORT int32_t access_nested(const Nested *n_ptr) {
  // Edge case: `n_ptr == NULL` (i.e. first Nested is None).
  if (!n_ptr) { return 0; }

  while (n_ptr->next) {
    n_ptr = n_ptr->next;
  }

  return n_ptr->value;
}

/* Test: test_access_static */

typedef struct Static {
    int32_t value;
    struct Static *recurse;
} Static;

EXPORT int32_t access_static(const Static *s_ptr) {
  return s_ptr->recurse->recurse->value;
}

/* Test: unexposed_reachable_alloc */

EXPORT uintptr_t do_one_deref(const int32_t ***ptr) {
  return (uintptr_t)*ptr;
}