Example: provenance_via_io_percentp_global.c

up: index
prev: provenance_union_punning_2_auto_yx.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?)

cerberus-concrete-PVI exit codes: compile 0 / execute 1 provenance_via_io_percentp_global.c:17:20: error: use of undeclared identifier '__cerbvar_EXIT_FAILURE'
if (n != 1) exit(EXIT_FAILURE);
^
§6.5.1#2:
2 An identifier is a primary expression, provided it has been declared as designating an
object (in which case it is an lvalue) or a function (in which case it is a function
designator).91)
cerberus-concrete-PNVI exit codes: compile 0 / execute 1 provenance_via_io_percentp_global.c:17:20: error: use of undeclared identifier '__cerbvar_EXIT_FAILURE'
if (n != 1) exit(EXIT_FAILURE);
^
§6.5.1#2:
2 An identifier is a primary expression, provided it has been declared as designating an
object (in which case it is an lvalue) or a function (in which case it is a function
designator).91)
gcc-8.1-O0 Addresses: p=0x600cf0
Addresses: r=0x600cf0
x=12 *r=12 b1=true b2=true
gcc-8.1-O2 Addresses: p=0x600c38
Addresses: r=0x600c38
x=12 *r=12 b1=true b2=true
gcc-8.1-O3 Addresses: p=0x600c38
Addresses: r=0x600c38
x=12 *r=12 b1=true b2=true
gcc-8.1-O2-no-strict-aliasing Addresses: p=0x600c38
Addresses: r=0x600c38
x=12 *r=12 b1=true b2=true
gcc-8.1-O3-no-strict-aliasing Addresses: p=0x600c38
Addresses: r=0x600c38
x=12 *r=12 b1=true b2=true
clang-6.0-O0 Addresses: p=0x601068
Addresses: r=0x601068
x=12 *r=12 b1=true b2=true
clang-6.0-O2 Addresses: p=0x601060
Addresses: r=0x601060
x=12 *r=12 b1=true b2=true
clang-6.0-O3 Addresses: p=0x601060
Addresses: r=0x601060
x=12 *r=12 b1=true b2=true
clang-6.0-O2-no-strict-aliasing Addresses: p=0x601060
Addresses: r=0x601060
x=12 *r=12 b1=true b2=true
clang-6.0-O3-no-strict-aliasing Addresses: p=0x601060
Addresses: r=0x601060
x=12 *r=12 b1=true b2=true
clang-6.0-UBSAN Addresses: p=0x632b80
Addresses: r=0x632b80
x=12 *r=12 b1=true b2=true
clang-6.0-ASAN Addresses: p=0x716b80
Addresses: r=0x716b80
x=12 *r=12 b1=true b2=true
clang-6.0-MSAN Addresses: p=0x6b7b00
Addresses: r=0x6b7b00
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
compcert-3.4 Addresses: p=0x601068
Addresses: r=0x601068
x=12 *r=12 b1=true b2=true
compcert-3.4-O Addresses: p=0x601068
Addresses: r=0x601068
x=12 *r=12 b1=true b2=true
kcc-1.0 exit codes: compile 0 / execute 139 Addresses: p=(nil)
Addresses: r=(nil)
Dereferencing a null pointer:
> in main at provenance_via_io_percentp_global.c:20:3

Undefined behavior (UB-CER3):
see C11 section 6.5.3.2:4 http://rvdoc.org/C11/6.5.3.2
see C11 section J.2:1 item 43 http://rvdoc.org/C11/J.2
see CERT-C section EXP34-C http://rvdoc.org/CERT-C/EXP34-C
see MISRA-C section 8.1:3 http://rvdoc.org/MISRA-C/8.1

Execution failed (configuration dumped)