Example: pointer_offset_from_subtraction_within_malloc_struct_1.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct { char c; int i; } st;
int main() {
void *a = malloc(4*sizeof(st)); // allocation P
// initialise one member of two elements of a notional array of structs
char *p1 = (char*)((unsigned char*)a+1*sizeof(int)+offsetof(st,c));
int *p3 = (int *)((unsigned char*)a+3*sizeof(int)+offsetof(st,i));
*p1 = 'a';
*p3 = 3;
// calculate an unsigned char* offset between pointers to those elements
ptrdiff_t offset=((unsigned char*)p3-offsetof(st,i)) -
((unsigned char*)p1-offsetof(st,c)); // provenance ?
// add the offset to a pointer to the first struct
unsigned char *q1 = (unsigned char*)p1 - offsetof(st,c);// provenance P
unsigned char *q3 = ((unsigned char*)p1 - offsetof(st,c)) + offset; // provenance P
// and adapt to point to the i element of the third
unsigned char *q3i = q3 + offsetof(st,i); // provenance P
char *r1 = (char*)q1;
int *r3 = (int*)q3i;
printf("Addresses: a=%p p3=%p r3=%p\n",a,(void*)p3,(void*)r3);
// if that has the same representation as the pointer to the i member of the third...
if (memcmp(&p3, &r3, sizeof(p3)) == 0) {
// try to use it to access that
*r3 = 33; // is this free of undefined behaviour?
printf("*p3=%d *r3=%d \n", *p3, *r3);
}
return 0;
}
[link to test in Cerberus and Compiler Explorer]
Experimental data (what does this mean?)
SOURCES MISMATCH
gcc-8.1-O0 |   | Addresses: a=0x23a1010 p3=0x23a1020 r3=0x23a1020 *p3=33 *r3=33
|
gcc-8.1-O2 |   | Addresses: a=0xd3a010 p3=0xd3a020 r3=0xd3a020 *p3=33 *r3=33
|
gcc-8.1-O3 |   | Addresses: a=0x1ce5010 p3=0x1ce5020 r3=0x1ce5020 *p3=33 *r3=33
|
gcc-8.1-O2-no-strict-aliasing |   | Addresses: a=0x12a0010 p3=0x12a0020 r3=0x12a0020 *p3=33 *r3=33
|
gcc-8.1-O3-no-strict-aliasing |   | Addresses: a=0x1f93010 p3=0x1f93020 r3=0x1f93020 *p3=33 *r3=33
|
clang-6.0-O0 |   | Addresses: a=0xe91010 p3=0xe91020 r3=0xe91020 *p3=33 *r3=33
|
clang-6.0-O2 |   | Addresses: a=0xdb4010 p3=0xdb4020 r3=0xdb4020 *p3=33 *r3=33
|
clang-6.0-O3 |   | Addresses: a=0x1d8a010 p3=0x1d8a020 r3=0x1d8a020 *p3=33 *r3=33
|
clang-6.0-O2-no-strict-aliasing |   | Addresses: a=0x1d58010 p3=0x1d58020 r3=0x1d58020 *p3=33 *r3=33
|
clang-6.0-O3-no-strict-aliasing |   | Addresses: a=0x12b7010 p3=0x12b7020 r3=0x12b7020 *p3=33 *r3=33
|
clang-6.0-UBSAN |   | Addresses: a=0x2cf0040 p3=0x2cf0050 r3=0x2cf0050 *p3=33 *r3=33
|
clang-6.0-ASAN |   | exit codes: compile 0 / execute 1
================================================================= ==3658==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 32 byte(s) in 1 object(s) allocated from: #0 0x4ba4a3 in __interceptor_malloc /tmp/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:88:3 #1 0x4e71cd in main (/auto/homes/vb358/charon2/pointer_offset_from_subtraction_within_malloc_struct_1.c.clang-6.0-ASAN.out+0x4e71cd)
SUMMARY: AddressSanitizer: 32 byte(s) leaked in 1 allocation(s).
|
clang-6.0-MSAN |   | Addresses: a=0x702000000000 p3=0x702000000010 r3=0x702000000010 *p3=33 *r3=33
|
icc-19-O0 |   | Addresses: a=0x17c5010 p3=0x17c5020 r3=0x17c5020 *p3=33 *r3=33
|
icc-19-O2 |   | Addresses: a=0x738010 p3=0x738020 r3=0x738020 *p3=33 *r3=33
|
icc-19-O3 |   | Addresses: a=0xcd7010 p3=0xcd7020 r3=0xcd7020 *p3=33 *r3=33
|
icc-19-O2-no-strict-aliasing |   | Addresses: a=0x8e7010 p3=0x8e7020 r3=0x8e7020 *p3=33 *r3=33
|
icc-19-O3-no-strict-aliasing |   | Addresses: a=0x1959010 p3=0x1959020 r3=0x1959020 *p3=33 *r3=33
|
cerberus-concrete |   | BEGIN EXEC[0] Defined {value: "Specified(0)", stdout: "Addresses: a=<16>:168 p3=<16>:184 r3=<16>:184\n*p3=33 *r3=33 \n", blocked: "false"} END EXEC[0] Time spent: 0.052334 seconds
|
cerberus-symbolic |   | exit codes: compile 0 / execute 1
cerberus: internal error, uncaught exception: Failure("TODO: Symbolic defacto, isWellAligned_ptrval")
|
gcc-4.9-shadowprov |   | Addresses: a=0x1097260 p3=0x1097270 r3=0x1097270 *p3=33 *r3=33
|
CHERI:MIPS-O0 |   | Addresses: a=0x4003f000 p3=0x4003f010 r3=0x4003f010 *p3=33 *r3=33
|
CHERI:MIPS-O2 |   | Addresses: a=0x4003f000 p3=0x4003f010 r3=0x4003f010 *p3=33 *r3=33
|
CHERI:MIPS-O2-no-strict-aliasing |   | Addresses: a=0x4003f000 p3=0x4003f010 r3=0x4003f010 *p3=33 *r3=33
|
CHERI:CHERI-O0-uintcap-addr-exact-equals |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O2-uintcap-addr-exact-equals |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O2-no-strict-aliasing-uintcap-addr-exact-equals |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O0-uintcap-offset-exact-equals |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O2-uintcap-offset-exact-equals |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O2-no-strict-aliasing-uintcap-offset-exact-equals |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O0-uintcap-addr |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O2-uintcap-addr |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O2-no-strict-aliasing-uintcap-addr |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O0-uintcap-offset |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O2-uintcap-offset |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
CHERI:CHERI-O2-no-strict-aliasing-uintcap-offset |   | Addresses: a=0x7c00008000 p3=0x7c00008010 r3=0x7c00008010 *p3=33 *r3=33
|
RV-Match |   | Addresses: a=(nil) p3=(nil) r3=(nil) *p1=0x61 *q3=11 *r1=0x61 *r3=11
|
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 Called from file "list.ml", line 55, characters 32-39 Called from file "list.ml", line 55, characters 32-39
|
compcert-3.2 |   | Addresses: a=0x1d1f010 p3=0x1d1f020 r3=0x1d1f020 *p3=33 *r3=33
|
compcert-3.2-O |   | Addresses: a=0x11f5010 p3=0x11f5020 r3=0x11f5020 *p3=33 *r3=33
|
compcert-3.2-interp |   | Time 0: calling main() --[step_internal_function]--> Time 1: in function main, statement a = malloc(4 * sizeof(struct _1193)); p1 = (signed char *) ((unsigned char *) . + 1 * sizeof(int) + 0U); p3 = (int *) ((unsigned char *) . + 3 * sizeof(int) + 4U); *p1 = 97; *p3 = 33; offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U); q1 = (unsigned char *) p1 - 0U; q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; return 0; --[step_seq]--> Time 2: in function main, statement a = malloc(4 * sizeof(struct _1193)); p1 = (signed char *) ((unsigned char *) . + 1 * sizeof(int) + 0U); p3 = (int *) ((unsigned char *) . + 3 * sizeof(int) + 4U); *p1 = 97; *p3 = 33; offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U); q1 = (unsigned char *) p1 - 0U; q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 3: in function main, statement a = malloc(4 * sizeof(struct _1193)); --[step_do_1]--> Time 4: in function main, expression a = malloc(4 * sizeof(struct _1193)) --[red_var_local]--> Time 5: in function main, expression <loc a> = malloc(4 * sizeof(struct _1193)) --[red_var_global]--> Time 6: in function main, expression <loc a> = <loc malloc>(4 * sizeof(struct _1193)) --[red_rvalof]--> Time 7: in function main, expression <loc a> = <ptr malloc>(4 * sizeof(struct _1193)) --[red_sizeof]--> Time 8: in function main, expression <loc a> = <ptr malloc>(4 * 8U) --[red_binop]--> Time 9: in function main, expression <loc a> = <ptr malloc>(32U) --[red_call]--> Time 10: calling malloc(32) --[step_external_function]--> Time 11: returning <ptr> --[step_returnstate]--> Time 12: in function main, expression <loc a> = <ptr> --[red_assign]--> Time 13: in function main, expression <ptr> --[step_do_2]--> Time 14: in function main, statement /*skip*/; --[step_skip_seq]--> Time 15: in function main, statement p1 = (signed char *) ((unsigned char *) . + 1 * sizeof(int) + 0U); p3 = (int *) ((unsigned char *) . + 3 * sizeof(int) + 4U); *p1 = 97; *p3 = 33; offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U); q1 = (unsigned char *) p1 - 0U; q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 16: in function main, statement p1 = (signed char *) ((unsigned char *) . + 1 * sizeof(int) + 0U); --[step_do_1]--> Time 17: in function main, expression p1 = (signed char *) ((unsigned char *) . + 1 * sizeof(int) + 0U) --[red_var_local]--> Time 18: in function main, expression <loc p1> = (signed char *) ((unsigned char *) . + 1 * sizeof(int) + 0U) --[red_var_local]--> Time 19: in function main, expression <loc p1> = (signed char *) ((unsigned char *) . + 1 * sizeof(int) + 0U) --[red_rvalof]--> Time 20: in function main, expression <loc p1> = (signed char *) ((unsigned char *) <ptr> + 1 * sizeof(int) + 0U) --[red_cast]--> Time 21: in function main, expression <loc p1> = (signed char *) (<ptr> + 1 * sizeof(int) + 0U) --[red_sizeof]--> Time 22: in function main, expression <loc p1> = (signed char *) (<ptr> + 1 * 4U + 0U) --[red_binop]--> Time 23: in function main, expression <loc p1> = (signed char *) (<ptr> + 4U + 0U) --[red_binop]--> Time 24: in function main, expression <loc p1> = (signed char *) (<ptr> + 0U) --[red_binop]--> Time 25: in function main, expression <loc p1> = (signed char *) <ptr> --[red_cast]--> Time 26: in function main, expression <loc p1> = <ptr> --[red_assign]--> Time 27: in function main, expression <ptr> --[step_do_2]--> Time 28: in function main, statement /*skip*/; --[step_skip_seq]--> Time 29: in function main, statement p3 = (int *) ((unsigned char *) . + 3 * sizeof(int) + 4U); *p1 = 97; *p3 = 33; offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U); q1 = (unsigned char *) p1 - 0U; q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 30: in function main, statement p3 = (int *) ((unsigned char *) . + 3 * sizeof(int) + 4U); --[step_do_1]--> Time 31: in function main, expression p3 = (int *) ((unsigned char *) . + 3 * sizeof(int) + 4U) --[red_var_local]--> Time 32: in function main, expression <loc p3> = (int *) ((unsigned char *) . + 3 * sizeof(int) + 4U) --[red_var_local]--> Time 33: in function main, expression <loc p3> = (int *) ((unsigned char *) . + 3 * sizeof(int) + 4U) --[red_rvalof]--> Time 34: in function main, expression <loc p3> = (int *) ((unsigned char *) <ptr> + 3 * sizeof(int) + 4U) --[red_cast]--> Time 35: in function main, expression <loc p3> = (int *) (<ptr> + 3 * sizeof(int) + 4U) --[red_sizeof]--> Time 36: in function main, expression <loc p3> = (int *) (<ptr> + 3 * 4U + 4U) --[red_binop]--> Time 37: in function main, expression <loc p3> = (int *) (<ptr> + 12U + 4U) --[red_binop]--> Time 38: in function main, expression <loc p3> = (int *) (<ptr> + 4U) --[red_binop]--> Time 39: in function main, expression <loc p3> = (int *) <ptr> --[red_cast]--> Time 40: in function main, expression <loc p3> = <ptr> --[red_assign]--> Time 41: in function main, expression <ptr> --[step_do_2]--> Time 42: in function main, statement /*skip*/; --[step_skip_seq]--> Time 43: in function main, statement *p1 = 97; *p3 = 33; offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U); q1 = (unsigned char *) p1 - 0U; q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 44: in function main, statement *p1 = 97; --[step_do_1]--> Time 45: in function main, expression *p1 = 97 --[red_var_local]--> Time 46: in function main, expression *<loc p1> = 97 --[red_rvalof]--> Time 47: in function main, expression *<ptr> = 97 --[red_deref]--> Time 48: in function main, expression <loc> = 97 --[red_assign]--> Time 49: in function main, expression 97 --[step_do_2]--> Time 50: in function main, statement /*skip*/; --[step_skip_seq]--> Time 51: in function main, statement *p3 = 33; offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U); q1 = (unsigned char *) p1 - 0U; q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 52: in function main, statement *p3 = 33; --[step_do_1]--> Time 53: in function main, expression *p3 = 33 --[red_var_local]--> Time 54: in function main, expression *<loc p3> = 33 --[red_rvalof]--> Time 55: in function main, expression *<ptr> = 33 --[red_deref]--> Time 56: in function main, expression <loc> = 33 --[red_assign]--> Time 57: in function main, expression 33 --[step_do_2]--> Time 58: in function main, statement /*skip*/; --[step_skip_seq]--> Time 59: in function main, statement offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U); q1 = (unsigned char *) p1 - 0U; q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 60: in function main, statement offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U); --[step_do_1]--> Time 61: in function main, expression offset = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U) --[red_var_local]--> Time 62: in function main, expression <loc offset> = (unsigned char *) p3 - 4U - ((unsigned char *) p1 - 0U) --[red_var_local]--> Time 63: in function main, expression <loc offset> = (unsigned char *) <loc p3> - 4U - ((unsigned char *) p1 - 0U) --[red_rvalof]--> Time 64: in function main, expression <loc offset> = (unsigned char *) <ptr> - 4U - ((unsigned char *) p1 - 0U) --[red_cast]--> Time 65: in function main, expression <loc offset> = <ptr> - 4U - ((unsigned char *) p1 - 0U) --[red_binop]--> Time 66: in function main, expression <loc offset> = <ptr> - ((unsigned char *) p1 - 0U) --[red_var_local]--> Time 67: in function main, expression <loc offset> = <ptr> - ((unsigned char *) <loc p1> - 0U) --[red_rvalof]--> Time 68: in function main, expression <loc offset> = <ptr> - ((unsigned char *) <ptr> - 0U) --[red_cast]--> Time 69: in function main, expression <loc offset> = <ptr> - (<ptr> - 0U) --[red_binop]--> Time 70: in function main, expression <loc offset> = <ptr> - <ptr> --[red_binop]--> Time 71: in function main, expression <loc offset> = 8 --[red_assign]--> Time 72: in function main, expression 8 --[step_do_2]--> Time 73: in function main, statement /*skip*/; --[step_skip_seq]--> Time 74: in function main, statement q1 = (unsigned char *) p1 - 0U; q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 75: in function main, statement q1 = (unsigned char *) p1 - 0U; --[step_do_1]--> Time 76: in function main, expression q1 = (unsigned char *) p1 - 0U --[red_var_local]--> Time 77: in function main, expression <loc q1> = (unsigned char *) p1 - 0U --[red_var_local]--> Time 78: in function main, expression <loc q1> = (unsigned char *) <loc p1> - 0U --[red_rvalof]--> Time 79: in function main, expression <loc q1> = (unsigned char *) <ptr> - 0U --[red_cast]--> Time 80: in function main, expression <loc q1> = <ptr> - 0U --[red_binop]--> Time 81: in function main, expression <loc q1> = <ptr> --[red_assign]--> Time 82: in function main, expression <ptr> --[step_do_2]--> Time 83: in function main, statement /*skip*/; --[step_skip_seq]--> Time 84: in function main, statement q3 = (unsigned char *) p1 - 0U + offset; q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 85: in function main, statement q3 = (unsigned char *) p1 - 0U + offset; --[step_do_1]--> Time 86: in function main, expression q3 = (unsigned char *) p1 - 0U + offset --[red_var_local]--> Time 87: in function main, expression <loc q3> = (unsigned char *) p1 - 0U + offset --[red_var_local]--> Time 88: in function main, expression <loc q3> = (unsigned char *) <loc p1> - 0U + offset --[red_rvalof]--> Time 89: in function main, expression <loc q3> = (unsigned char *) <ptr> - 0U + offset --[red_cast]--> Time 90: in function main, expression <loc q3> = <ptr> - 0U + offset --[red_binop]--> Time 91: in function main, expression <loc q3> = <ptr> + offset --[red_var_local]--> Time 92: in function main, expression <loc q3> = <ptr> + <loc offset> --[red_rvalof]--> Time 93: in function main, expression <loc q3> = <ptr> + 8 --[red_binop]--> Time 94: in function main, expression <loc q3> = <ptr> --[red_assign]--> Time 95: in function main, expression <ptr> --[step_do_2]--> Time 96: in function main, statement /*skip*/; --[step_skip_seq]--> Time 97: in function main, statement q3i = q3 + 4U; r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 98: in function main, statement q3i = q3 + 4U; --[step_do_1]--> Time 99: in function main, expression q3i = q3 + 4U --[red_var_local]--> Time 100: in function main, expression <loc q3i> = q3 + 4U --[red_var_local]--> Time 101: in function main, expression <loc q3i> = <loc q3> + 4U --[red_rvalof]--> Time 102: in function main, expression <loc q3i> = <ptr> + 4U --[red_binop]--> Time 103: in function main, expression <loc q3i> = <ptr> --[red_assign]--> Time 104: in function main, expression <ptr> --[step_do_2]--> Time 105: in function main, statement /*skip*/; --[step_skip_seq]--> Time 106: in function main, statement r1 = (signed char *) q1; r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 107: in function main, statement r1 = (signed char *) q1; --[step_do_1]--> Time 108: in function main, expression r1 = (signed char *) q1 --[red_var_local]--> Time 109: in function main, expression <loc r1> = (signed char *) q1 --[red_var_local]--> Time 110: in function main, expression <loc r1> = (signed char *) <loc q1> --[red_rvalof]--> Time 111: in function main, expression <loc r1> = (signed char *) <ptr> --[red_cast]--> Time 112: in function main, expression <loc r1> = <ptr> --[red_assign]--> Time 113: in function main, expression <ptr> --[step_do_2]--> Time 114: in function main, statement /*skip*/; --[step_skip_seq]--> Time 115: in function main, statement r3 = (int *) q3i; printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 116: in function main, statement r3 = (int *) q3i; --[step_do_1]--> Time 117: in function main, expression r3 = (int *) q3i --[red_var_local]--> Time 118: in function main, expression <loc r3> = (int *) q3i --[red_var_local]--> Time 119: in function main, expression <loc r3> = (int *) <loc q3i> --[red_rvalof]--> Time 120: in function main, expression <loc r3> = (int *) <ptr> --[red_cast]--> Time 121: in function main, expression <loc r3> = <ptr> --[red_assign]--> Time 122: in function main, expression <ptr> --[step_do_2]--> Time 123: in function main, statement /*skip*/; --[step_skip_seq]--> Time 124: in function main, statement printf(__stringlit_1, a, (void *) p3, (void *) r3); if (memcmp(&p3, &r3, sizeof(int *)) == 0) { *r3 = 11; printf(__stringlit_2, (unsigned int) *., *., (unsigned int) *., *.); } return 0; --[step_seq]--> Time 125: in function main, statement printf(__stringlit_1, a, (void *) p3, (void *) r3); --[step_do_1]--> Time 126: in function main, expression printf(__stringlit_1, a, (void *) p3, (void *) r3) --[red_var_global]--> Time 127: in function main, expression printf(<loc __stringlit_1>, a, (void *) p3, (void *) r3) --[red_rvalof]--> Time 128: in function main, expression printf(<ptr __stringlit_1>, a, (void *) p3, (void *) r3) --[red_var_local]--> Time 129: in function main, expression printf(<ptr __stringlit_1>, <loc a>, (void *) p3, (void *) r3) --[red_rvalof]--> Time 130: in function main, expression printf(<ptr __stringlit_1>, <ptr>, (void *) p3, (void *) r3) --[red_var_local]--> Time 131: in function main, expression printf(<ptr __stringlit_1>, <ptr>, (void *) <loc p3>, (void *) r3) --[red_rvalof]--> Time 132: in function main, expression printf(<ptr __stringlit_1>, <ptr>, (void *) <ptr>, (void *) r3) --[red_cast]--> Time 133: in function main, expression printf(<ptr __stringlit_1>, <ptr>, <ptr>, (void *) r3) --[red_var_local]--> Time 134: in function main, expression printf(<ptr __stringlit_1>, <ptr>, <ptr>, (void *) <loc r3>) --[red_rvalof]--> Time 135: in function main, expression printf(<ptr __stringlit_1>, <ptr>, <ptr>, (void *) <ptr>) --[red_cast]--> Time 136: in function main, expression printf(<ptr __stringlit_1>, <ptr>, <ptr>, <ptr>) Addresses: a=<67+0> p3=<67+16> r3=<67+16>
Stuck state: in function main, expression printf(<ptr __stringlit_1>, <ptr>, <ptr>, <ptr>) Addresses: a=<67+0> p3=<67+16> r3=<67+16>
Stuck subexpression: printf(<ptr __stringlit_1>, <ptr>, <ptr>, <ptr>) ERROR: Undefined behavior In file included from pointer_offset_from_subtraction_within_malloc_struct_1.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.
|