Example: provenance_basic_global_xy.c
#include <stdio.h>
#include <string.h>
int x=1, y=2;
int main() {
int *p = &x + 1;
int *q = &y;
printf("Addresses: p=%p q=%p\n",(void*)p,(void*)q);
if (memcmp(&p, &q, sizeof(p)) == 0) {
*p = 11; // does this have undefined behaviour?
printf("x=%d y=%d *p=%d *q=%d\n",x,y,*p,*q);
}
return 0;
}
[link to test in Cerberus and Compiler Explorer]
Experimental data (what does this mean?)
gcc-8.1-O0 |   | Addresses: p=0x600a2c q=0x600a2c x=1 y=11 *p=11 *q=11
|
gcc-8.1-O2 |   | Addresses: p=0x6009c8 q=0x6009c0
|
gcc-8.1-O3 |   | Addresses: p=0x6009c8 q=0x6009c0
|
gcc-8.1-O2-no-strict-aliasing |   | Addresses: p=0x6009c8 q=0x6009c0
|
gcc-8.1-O3-no-strict-aliasing |   | Addresses: p=0x6009c8 q=0x6009c0
|
clang-6.0-O0 |   | Addresses: p=0x60103c q=0x60103c x=1 y=11 *p=11 *q=11
|
clang-6.0-O2 |   | Addresses: p=0x60103c q=0x60103c x=1 y=11 *p=11 *q=11
|
clang-6.0-O3 |   | Addresses: p=0x60103c q=0x60103c x=1 y=11 *p=11 *q=11
|
clang-6.0-O2-no-strict-aliasing |   | Addresses: p=0x60103c q=0x60103c x=1 y=11 *p=11 *q=11
|
clang-6.0-O3-no-strict-aliasing |   | Addresses: p=0x60103c q=0x60103c x=1 y=11 *p=11 *q=11
|
clang-6.0-UBSAN |   | Addresses: p=0x631b54 q=0x631b54 x=1 y=11 *p=11 *q=11 provenance_basic_global_xy.c:9:5: runtime error: store to address 0x000000631b54 with insufficient space for an object of type 'int' 0x000000631b54: note: pointer points here 01 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 24 7f 42 00 00 00 00 00 09 00 00 00 ff ff ff ff ^ provenance_basic_global_xy.c:10:42: runtime error: load of address 0x000000631b54 with insufficient space for an object of type 'int' 0x000000631b54: note: pointer points here 01 00 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 24 7f 42 00 00 00 00 00 09 00 00 00 ff ff ff ff ^
|
clang-6.0-ASAN |   | Addresses: p=0x716b64 q=0x716ba0
|
clang-6.0-MSAN |   | Addresses: p=0x6b7af4 q=0x6b7af4 x=1 y=11 *p=11 *q=11
|
icc-19-O0 |   | Addresses: p=0x600b5c q=0x600b5c x=1 y=11 *p=11 *q=11
|
icc-19-O2 |   | Addresses: p=0x6046c4 q=0x6046c4 x=1 y=2 *p=11 *q=11
|
icc-19-O3 |   | Addresses: p=0x6046c4 q=0x6046c4 x=1 y=2 *p=11 *q=11
|
icc-19-O2-no-strict-aliasing |   | Addresses: p=0x6046c4 q=0x6046c4 x=1 y=2 *p=11 *q=11
|
icc-19-O3-no-strict-aliasing |   | Addresses: p=0x6046c4 q=0x6046c4 x=1 y=2 *p=11 *q=11
|
cerberus-concrete |   | BEGIN EXEC[0] Killed {msg: MerrAccess Store [provenance_basic_global_xy.c:9:5-12] OutOfBoundPtr} END EXEC[0] Time spent: 0.037673 seconds
|
cerberus-symbolic |   | BEGIN EXEC[0] Undefined [other_location(Core parser)]{id: [DUMMY(rev_listFromStr_aux)]} END EXEC[0] Time spent: 0.075464 seconds
|
gcc-4.9-shadowprov |   | Addresses: p=0x415150 q=0x415148
|
CHERI:MIPS-O0 |   | Addresses: p=0x30024 q=0x30024 x=1 y=11 *p=11 *q=11
|
CHERI:MIPS-O2 |   | Addresses: p=0x30024 q=0x30024 x=1 y=11 *p=11 *q=11
|
CHERI:MIPS-O2-no-strict-aliasing |   | Addresses: p=0x30024 q=0x30024 x=1 y=11 *p=11 *q=11
|
CHERI:CHERI-O0-uintcap-addr-exact-equals |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O2-uintcap-addr-exact-equals |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O2-no-strict-aliasing-uintcap-addr-exact-equals |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O0-uintcap-offset-exact-equals |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O2-uintcap-offset-exact-equals |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O2-no-strict-aliasing-uintcap-offset-exact-equals |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O0-uintcap-addr |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O2-uintcap-addr |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O2-no-strict-aliasing-uintcap-addr |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O0-uintcap-offset |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O2-uintcap-offset |   | Addresses: p=0x120020014 q=0x120020014
|
CHERI:CHERI-O2-no-strict-aliasing-uintcap-offset |   | Addresses: p=0x120020014 q=0x120020014
|
RV-Match |   | Addresses: p=(nil) q=(nil) x=1 y=2 *p=0 *q=2 Comparison of unspecified value: > in memcmp at /opt/rv-match/c-semantics/x86_64-linux-gcc-glibc/src/string.c:180:13 in main at provenance_basic_global_xy.c:8:3
Unspecified value or behavior (USP-CERL7): see C11 section 6.5.9 http://rvdoc.org/C11/6.5.9 see MISRA-C section 8.1:3 http://rvdoc.org/MISRA-C/8.1
Dereferencing a pointer past the end of an array: > in main at provenance_basic_global_xy.c:9:5
Undefined behavior (UB-CER4): see C11 section 6.5.6:8 http://rvdoc.org/C11/6.5.6 see C11 section J.2:1 items 47 and 49 http://rvdoc.org/C11/J.2 see CERT-C section ARR30-C http://rvdoc.org/CERT-C/ARR30-C see CERT-C section ARR37-C http://rvdoc.org/CERT-C/ARR37-C see CERT-C section STR31-C http://rvdoc.org/CERT-C/STR31-C see MISRA-C section 8.18:1 http://rvdoc.org/MISRA-C/8.18 see MISRA-C section 8.1:3 http://rvdoc.org/MISRA-C/8.1
Trying to write outside the bounds of an object: > in main at provenance_basic_global_xy.c:9:5
Undefined behavior (UB-EIO2): see C11 section 6.5.6:8 http://rvdoc.org/C11/6.5.6 see C11 section J.2:1 items 47 and 49 http://rvdoc.org/C11/J.2 see CERT-C section ARR30-C http://rvdoc.org/CERT-C/ARR30-C see CERT-C section ARR37-C http://rvdoc.org/CERT-C/ARR37-C see CERT-C section MEM35-C http://rvdoc.org/CERT-C/MEM35-C see CERT-C section STR31-C http://rvdoc.org/CERT-C/STR31-C see MISRA-C section 8.1:3 http://rvdoc.org/MISRA-C/8.1
Dereferencing a pointer past the end of an array: > in main at provenance_basic_global_xy.c:10:5
Undefined behavior (UB-CER4): see C11 section 6.5.6:8 http://rvdoc.org/C11/6.5.6 see C11 section J.2:1 items 47 and 49 http://rvdoc.org/C11/J.2 see CERT-C section ARR30-C http://rvdoc.org/CERT-C/ARR30-C see CERT-C section ARR37-C http://rvdoc.org/CERT-C/ARR37-C see CERT-C section STR31-C http://rvdoc.org/CERT-C/STR31-C see MISRA-C section 8.18:1 http://rvdoc.org/MISRA-C/8.18 see MISRA-C section 8.1:3 http://rvdoc.org/MISRA-C/8.1
Reading outside the bounds of an object: > in main at provenance_basic_global_xy.c:10:5
Undefined behavior (UB-EIO7): see C11 section 6.3.2.1:1 http://rvdoc.org/C11/6.3.2.1 see C11 section J.2:1 item 19 http://rvdoc.org/C11/J.2 see CERT-C section ARR30-C http://rvdoc.org/CERT-C/ARR30-C see CERT-C section ARR37-C http://rvdoc.org/CERT-C/ARR37-C see CERT-C section STR31-C http://rvdoc.org/CERT-C/STR31-C see CERT-C section STR32-C http://rvdoc.org/CERT-C/STR32-C see MISRA-C section 8.1:3 http://rvdoc.org/MISRA-C/8.1
|
ch2o |   | Fatal error: exception Failure("parse_printf") Raised at file "pervasives.ml", line 30, characters 22-33 Called from file "list.ml", line 55, characters 20-23 Called from file "list.ml", line 55, characters 32-39 Called from file "list.ml", line 55, characters 32-39 Called from file "list.ml", line 55, characters 32-39 Called from file "list.ml", line 55, characters 32-39 Called from file "list.ml", line 55, characters 32-39 Called from file "list.ml", line 55, characters 32-39 Called from file "list.ml", line 55, characters 32-39
|
compcert-3.2 |   | Addresses: p=0x601044 q=0x601044 x=1 y=11 *p=11 *q=11
|
compcert-3.2-O |   | Addresses: p=0x601044 q=0x601044 x=1 y=11 *p=11 *q=11
|
compcert-3.2-interp |   | Time 0: calling main() --[step_internal_function]--> Time 1: in function main, statement p = &x + 1; q = &y; printf(__stringlit_1, (void *) p, (void *) q); if (memcmp(&p, &q, sizeof(int *)) == 0) { *p = 11; printf(__stringlit_2, x, y, *., *.); } return 0; return 0; --[step_seq]--> Time 2: in function main, statement p = &x + 1; q = &y; printf(__stringlit_1, (void *) p, (void *) q); if (memcmp(&p, &q, sizeof(int *)) == 0) { *p = 11; printf(__stringlit_2, x, y, *., *.); } return 0; --[step_seq]--> Time 3: in function main, statement p = &x + 1; --[step_do_1]--> Time 4: in function main, expression p = &x + 1 --[red_var_local]--> Time 5: in function main, expression <loc p> = &x + 1 --[red_var_global]--> Time 6: in function main, expression <loc p> = &<loc x> + 1 --[red_addrof]--> Time 7: in function main, expression <loc p> = <ptr x> + 1 --[red_binop]--> Time 8: in function main, expression <loc p> = <ptr x+4> --[red_assign]--> Time 9: in function main, expression <ptr x+4> --[step_do_2]--> Time 10: in function main, statement /*skip*/; --[step_skip_seq]--> Time 11: in function main, statement q = &y; printf(__stringlit_1, (void *) p, (void *) q); if (memcmp(&p, &q, sizeof(int *)) == 0) { *p = 11; printf(__stringlit_2, x, y, *., *.); } return 0; --[step_seq]--> Time 12: in function main, statement q = &y; --[step_do_1]--> Time 13: in function main, expression q = &y --[red_var_local]--> Time 14: in function main, expression <loc q> = &y --[red_var_global]--> Time 15: in function main, expression <loc q> = &<loc y> --[red_addrof]--> Time 16: in function main, expression <loc q> = <ptr y> --[red_assign]--> Time 17: in function main, expression <ptr y> --[step_do_2]--> Time 18: in function main, statement /*skip*/; --[step_skip_seq]--> Time 19: in function main, statement printf(__stringlit_1, (void *) p, (void *) q); if (memcmp(&p, &q, sizeof(int *)) == 0) { *p = 11; printf(__stringlit_2, x, y, *., *.); } return 0; --[step_seq]--> Time 20: in function main, statement printf(__stringlit_1, (void *) p, (void *) q); --[step_do_1]--> Time 21: in function main, expression printf(__stringlit_1, (void *) p, (void *) q) --[red_var_global]--> Time 22: in function main, expression printf(<loc __stringlit_1>, (void *) p, (void *) q) --[red_rvalof]--> Time 23: in function main, expression printf(<ptr __stringlit_1>, (void *) p, (void *) q) --[red_var_local]--> Time 24: in function main, expression printf(<ptr __stringlit_1>, (void *) <loc p>, (void *) q) --[red_rvalof]--> Time 25: in function main, expression printf(<ptr __stringlit_1>, (void *) <ptr x+4>, (void *) q) --[red_cast]--> Time 26: in function main, expression printf(<ptr __stringlit_1>, <ptr x+4>, (void *) q) --[red_var_local]--> Time 27: in function main, expression printf(<ptr __stringlit_1>, <ptr x+4>, (void *) <loc q>) --[red_rvalof]--> Time 28: in function main, expression printf(<ptr __stringlit_1>, <ptr x+4>, (void *) <ptr y>) --[red_cast]--> Time 29: in function main, expression printf(<ptr __stringlit_1>, <ptr x+4>, <ptr y>) Addresses: p=<56+4> q=<57+0> Time 29: observable event: extcall printf(& __stringlit_1, & x+4, & y) -> 29 --[red_builtin]--> Time 30: in function main, expression 29 --[step_do_2]--> Time 31: in function main, statement /*skip*/; --[step_skip_seq]--> Time 32: in function main, statement if (memcmp(&p, &q, sizeof(int *)) == 0) { *p = 11; printf(__stringlit_2, x, y, *., *.); } return 0; --[step_seq]--> Time 33: in function main, statement if (memcmp(&p, &q, sizeof(int *)) == 0) { *p = 11; printf(__stringlit_2, x, y, *., *.); } --[step_ifthenelse_1]--> Time 34: in function main, expression memcmp(&p, &q, sizeof(int *)) == 0 --[red_var_global]--> Time 35: in function main, expression <loc memcmp>(&p, &q, sizeof(int *)) == 0 --[red_rvalof]--> Time 36: in function main, expression <ptr memcmp>(&p, &q, sizeof(int *)) == 0 --[red_var_local]--> Time 37: in function main, expression <ptr memcmp>(&<loc p>, &q, sizeof(int *)) == 0 --[red_addrof]--> Time 38: in function main, expression <ptr memcmp>(<ptr p>, &q, sizeof(int *)) == 0 --[red_var_local]--> Time 39: in function main, expression <ptr memcmp>(<ptr p>, &<loc q>, sizeof(int *)) == 0 --[red_addrof]--> Time 40: in function main, expression <ptr memcmp>(<ptr p>, <ptr q>, sizeof(int *)) == 0 --[red_sizeof]--> Time 41: in function main, expression <ptr memcmp>(<ptr p>, <ptr q>, 4U) == 0 --[red_call]--> Time 42: calling memcmp(<ptr>, <ptr>, 4) Stuck state: calling memcmp(<ptr>, <ptr>, 4) ERROR: Undefined behavior In file included from provenance_basic_global_xy.c:1: In file included from /usr/include/stdio.h:64: In file included from /usr/include/_stdio.h:68: /usr/include/sys/cdefs.h:81:2: warning: "Unsupported compiler detected" [-W#warnings] #warning "Unsupported compiler detected" ^ 1 warning generated.
|