Example: provenance_via_io_percentp_global.c

up: index
prev: provenance_union_punning_3_global.c
next: provenance_via_io_bytewise_global.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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <inttypes.h>
    int x=1;
    int main() {
      int *p = &x;
      FILE *f = fopen(
        "provenance_via_io_percentp_global.tmp","w+b");
      printf("Addresses: p=%p\n",(void*)p);
      // print pointer address to a file
      fprintf(f,"%p\n",(void*)p);
      rewind(f);
      void *rv;
      int n = fscanf(f,"%p\n",&rv);
      int *r = (int *)rv;
      if (n != 1) exit(EXIT_FAILURE);
      printf("Addresses: r=%p\n",(void*)r);
      // are r and p 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: p=0x100001048
Addresses: r=0x100001048
x=12 *r=12 b1=true b2=true
gcc-8.3-O2 Addresses: p=0x100001040
Addresses: r=0x100001040
x=12 *r=12 b1=true b2=true
gcc-8.3-O3 Addresses: p=0x100001040
Addresses: r=0x100001040
x=12 *r=12 b1=true b2=true
gcc-8.3-O2-no-strict-aliasing Addresses: p=0x100001040
Addresses: r=0x100001040
x=12 *r=12 b1=true b2=true
gcc-8.3-O3-no-strict-aliasing Addresses: p=0x100001040
Addresses: r=0x100001040
x=12 *r=12 b1=true b2=true
clang-7.0.1-O0 Addresses: p=0x100001048
Addresses: r=0x100001048
x=12 *r=12 b1=true b2=true
clang-7.0.1-O2 Addresses: p=0x100001040
Addresses: r=0x100001040
x=12 *r=12 b1=true b2=true
clang-7.0.1-O3 Addresses: p=0x100001040
Addresses: r=0x100001040
x=12 *r=12 b1=true b2=true
clang-7.0.1-O2-no-strict-aliasing Addresses: p=0x100001040
Addresses: r=0x100001040
x=12 *r=12 b1=true b2=true
clang-7.0.1-O3-no-strict-aliasing Addresses: p=0x100001040
Addresses: r=0x100001040
x=12 *r=12 b1=true b2=true
icc-19-O0 Addresses: p=0x600e70
Addresses: r=0x600e70
x=12 *r=12 b1=true b2=true
icc-19-O2 Addresses: p=0x6046e0
Addresses: r=0x6046e0
x=12 *r=12 b1=true b2=true
icc-19-O3 Addresses: p=0x6046e0
Addresses: r=0x6046e0
x=12 *r=12 b1=true b2=true
icc-19-O2-no-strict-aliasing Addresses: p=0x6046e0
Addresses: r=0x6046e0
x=12 *r=12 b1=true b2=true
icc-19-O3-no-strict-aliasing Addresses: p=0x6046e0
Addresses: r=0x6046e0
x=12 *r=12 b1=true b2=true