Example: provenance_via_io_uintptr_t_global.c

up: index
prev: provenance_via_io_bytewise_global.c
next: pointer_from_integer_1pg.c

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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <inttypes.h>
    int x=1;
    int main() {
      int *p = &x;
      uintptr_t i = (uintptr_t) p;
      FILE *f = fopen(
        "provenance_via_io_uintptr_t_global.tmp","w+b");
      printf("Addresses: i=%"PRIuPTR" \n",i);
      // print pointer address to a file
      fprintf(f,"%"PRIuPTR"\n",i);
      rewind(f);
      uintptr_t k;
      // read a pointer address from the file
      int n = fscanf(f,"%"SCNuPTR"\n",&k);
      if (n != 1) exit(EXIT_FAILURE);
      printf("Addresses: k=%"PRIuPTR"\n",k);
      int *r = (int *)k;
      // are r and q now equivalent?  
      *r=12; // is this free of undefined behaviour?                                                           
      _Bool b1 = (r==p); // do they compare equal?                      
      _Bool b2 = (0==memcmp(&r,&p,sizeof(r)));//same reps?
      printf("x=%i *r=%i b1=%s b2=%s\n",x,*r,
             b1?"true":"false",b2?"true":"false");
    }
[link to run test in Cerberus]

Experimental data (what does this mean?)

gcc-8.3-O0 Addresses: i=4294971464
Addresses: k=4294971464
x=12 *r=12 b1=true b2=true
gcc-8.3-O2 Addresses: i=4294971456
Addresses: k=4294971456
x=12 *r=12 b1=true b2=true
gcc-8.3-O3 Addresses: i=4294971456
Addresses: k=4294971456
x=12 *r=12 b1=true b2=true
gcc-8.3-O2-no-strict-aliasing Addresses: i=4294971456
Addresses: k=4294971456
x=12 *r=12 b1=true b2=true
gcc-8.3-O3-no-strict-aliasing Addresses: i=4294971456
Addresses: k=4294971456
x=12 *r=12 b1=true b2=true
clang-7.0.1-O0 Addresses: i=4294971464
Addresses: k=4294971464
x=12 *r=12 b1=true b2=true
clang-7.0.1-O2 Addresses: i=4294971456
Addresses: k=4294971456
x=12 *r=12 b1=true b2=true
clang-7.0.1-O3 Addresses: i=4294971456
Addresses: k=4294971456
x=12 *r=12 b1=true b2=true
clang-7.0.1-O2-no-strict-aliasing Addresses: i=4294971456
Addresses: k=4294971456
x=12 *r=12 b1=true b2=true
clang-7.0.1-O3-no-strict-aliasing Addresses: i=4294971456
Addresses: k=4294971456
x=12 *r=12 b1=true b2=true
icc-19-O0 Addresses: i=6295160
Addresses: k=6295160
x=12 *r=12 b1=true b2=true
icc-19-O2 Addresses: i=6309600
Addresses: k=6309600
x=12 *r=12 b1=true b2=true
icc-19-O3 Addresses: i=6309600
Addresses: k=6309600
x=12 *r=12 b1=true b2=true
icc-19-O2-no-strict-aliasing Addresses: i=6309600
Addresses: k=6309600
x=12 *r=12 b1=true b2=true
icc-19-O3-no-strict-aliasing Addresses: i=6309600
Addresses: k=6309600
x=12 *r=12 b1=true b2=true