Example: pointer_offset_from_subtraction_within_malloc_int_1.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
int main() {
void *a = malloc(4*sizeof(int)); // allocation P
// initialise two elements of a notional array within the allocation
int *p1 = (int*)((unsigned char*)a+1*sizeof(int));
int *p3 = (int*)((unsigned char*)a+3*sizeof(int));
*p1 = 1;
*p3 = 3;
// calculate an unsigned char* offset between pointers to those elements
ptrdiff_t offset=(unsigned char*)p3-(unsigned char*)p1; // provenance ?
// add the offset to a pointer to the first
unsigned char *q1 = (unsigned char*)p1; // provenance P
unsigned char *q3 = (unsigned char*)p1 + offset; // provenance ?
int *r1 = (int*)q1;
int *r3 = (int*)q3;
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 third...
if (memcmp(&p3, &r3, sizeof(p3)) == 0) {
// try to use it to access that
*r3 = 11; // is this free of undefined behaviour?
printf("*p1=%d *r1=%d *r3=%d \n",
*p1, *r1, *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=0x7c7010 p3=0x7c701c r3=0x7c701c
*p1=1 *r1=1 *r3=11
gcc-8.1-O2 Addresses: a=0x14fa010 p3=0x14fa01c r3=0x14fa01c
*p1=1 *r1=1 *r3=11
gcc-8.1-O3 Addresses: a=0x148b010 p3=0x148b01c r3=0x148b01c
*p1=1 *r1=1 *r3=11
gcc-8.1-O2-no-strict-aliasing Addresses: a=0x11f1010 p3=0x11f101c r3=0x11f101c
*p1=1 *r1=1 *r3=11
gcc-8.1-O3-no-strict-aliasing Addresses: a=0xc4e010 p3=0xc4e01c r3=0xc4e01c
*p1=1 *r1=1 *r3=11
clang-6.0-O0 Addresses: a=0x1534010 p3=0x153401c r3=0x153401c
*p1=1 *r1=1 *r3=11
clang-6.0-O2 Addresses: a=0x21fc010 p3=0x21fc01c r3=0x21fc01c
*p1=1 *r1=1 *r3=11
clang-6.0-O3 Addresses: a=0xa50010 p3=0xa5001c r3=0xa5001c
*p1=1 *r1=1 *r3=11
clang-6.0-O2-no-strict-aliasing Addresses: a=0x879010 p3=0x87901c r3=0x87901c
*p1=1 *r1=1 *r3=11
clang-6.0-O3-no-strict-aliasing Addresses: a=0x1e8a010 p3=0x1e8a01c r3=0x1e8a01c
*p1=1 *r1=1 *r3=11
clang-6.0-UBSAN Addresses: a=0x2f21040 p3=0x2f2104c r3=0x2f2104c
*p1=1 *r1=1 *r3=11
clang-6.0-ASAN exit codes: compile 0 / execute 1
=================================================================
==3875==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 16 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 0x4e71d1 in main (/auto/homes/vb358/charon2/pointer_offset_from_subtraction_within_malloc_int_1.c.clang-6.0-ASAN.out+0x4e71d1)

SUMMARY: AddressSanitizer: 16 byte(s) leaked in 1 allocation(s).
clang-6.0-MSAN Addresses: a=0x701000000000 p3=0x70100000000c r3=0x70100000000c
*p1=1 *r1=1 *r3=11
icc-19-O0 Addresses: a=0xef6010 p3=0xef601c r3=0xef601c
*p1=1 *r1=1 *r3=11
icc-19-O2 Addresses: a=0x9e9010 p3=0x9e901c r3=0x9e901c
*p1=1 *r1=1 *r3=11
icc-19-O3 Addresses: a=0x22af010 p3=0x22af01c r3=0x22af01c
*p1=1 *r1=1 *r3=11
icc-19-O2-no-strict-aliasing Addresses: a=0x16a5010 p3=0x16a501c r3=0x16a501c
*p1=1 *r1=1 *r3=11
icc-19-O3-no-strict-aliasing Addresses: a=0xcff010 p3=0xcff01c r3=0xcff01c
*p1=1 *r1=1 *r3=11
cerberus-concrete BEGIN EXEC[0]
Defined {value: "Specified(0)", stdout: "Addresses: a=<15>:168 p3=<15>:180 r3=<15>:180\n*p1=1 *r1=1 *r3=11 \n", blocked: "false"}
END EXEC[0]
Time spent: 0.052822 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=0x11a3290 p3=0x11a329c r3=0x11a329c
*p1=1 *r1=1 *r3=11
CHERI:MIPS-O0 Addresses: a=0x4003f000 p3=0x4003f00c r3=0x4003f00c
*p1=1 *r1=1 *r3=11
CHERI:MIPS-O2 Addresses: a=0x4003f000 p3=0x4003f00c r3=0x4003f00c
*p1=1 *r1=1 *r3=11
CHERI:MIPS-O2-no-strict-aliasing Addresses: a=0x4003f000 p3=0x4003f00c r3=0x4003f00c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O0-uintcap-addr-exact-equals Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O2-uintcap-addr-exact-equals Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O2-no-strict-aliasing-uintcap-addr-exact-equals Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O0-uintcap-offset-exact-equals Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O2-uintcap-offset-exact-equals Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O2-no-strict-aliasing-uintcap-offset-exact-equals Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O0-uintcap-addr Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O2-uintcap-addr Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O2-no-strict-aliasing-uintcap-addr Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O0-uintcap-offset Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O2-uintcap-offset Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
CHERI:CHERI-O2-no-strict-aliasing-uintcap-offset Addresses: a=0x7c00008000 p3=0x7c0000800c r3=0x7c0000800c
*p1=1 *r1=1 *r3=11
RV-Match Addresses: a=(nil) p3=(nil) r3=(nil)
*p1=11 *q3=11 *r1=11 *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
compcert-3.2 Addresses: a=0x1cb9010 p3=0x1cb901c r3=0x1cb901c
*p1=1 *r1=1 *r3=11
compcert-3.2-O Addresses: a=0x2090010 p3=0x209001c r3=0x209001c
*p1=1 *r1=1 *r3=11
compcert-3.2-interp Time 0: calling main()
--[step_internal_function]-->
Time 1: in function main, statement
a = malloc(4 * sizeof(int));
p1 = (int *) ((unsigned char *) a + 1 * sizeof(int));
p3 = (int *) ((unsigned char *) a + 3 * sizeof(int));
*p1 = 11;
*p3 = 33;
offset = (unsigned char *) p3 - (unsigned char *) p1;
q1 = (unsigned char *) p1;
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
return 0;
--[step_seq]-->
Time 2: in function main, statement
a = malloc(4 * sizeof(int));
p1 = (int *) ((unsigned char *) a + 1 * sizeof(int));
p3 = (int *) ((unsigned char *) a + 3 * sizeof(int));
*p1 = 11;
*p3 = 33;
offset = (unsigned char *) p3 - (unsigned char *) p1;
q1 = (unsigned char *) p1;
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 3: in function main, statement a = malloc(4 * sizeof(int));
--[step_do_1]-->
Time 4: in function main, expression a = malloc(4 * sizeof(int))
--[red_var_local]-->
Time 5: in function main, expression <loc a> = malloc(4 * sizeof(int))
--[red_var_global]-->
Time 6: in function main, expression <loc a> = <loc malloc>(4 * sizeof(int))
--[red_rvalof]-->
Time 7: in function main, expression <loc a> = <ptr malloc>(4 * sizeof(int))
--[red_sizeof]-->
Time 8: in function main, expression <loc a> = <ptr malloc>(4 * 4U)
--[red_binop]-->
Time 9: in function main, expression <loc a> = <ptr malloc>(16U)
--[red_call]-->
Time 10: calling malloc(16)
--[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 = (int *) ((unsigned char *) a + 1 * sizeof(int));
p3 = (int *) ((unsigned char *) a + 3 * sizeof(int));
*p1 = 11;
*p3 = 33;
offset = (unsigned char *) p3 - (unsigned char *) p1;
q1 = (unsigned char *) p1;
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 16: in function main, statement
p1 = (int *) ((unsigned char *) a + 1 * sizeof(int));
--[step_do_1]-->
Time 17: in function main, expression
p1 = (int *) ((unsigned char *) a + 1 * sizeof(int))
--[red_var_local]-->
Time 18: in function main, expression
<loc p1> = (int *) ((unsigned char *) a + 1 * sizeof(int))
--[red_var_local]-->
Time 19: in function main, expression
<loc p1> = (int *) ((unsigned char *) <loc a> + 1 * sizeof(int))
--[red_rvalof]-->
Time 20: in function main, expression
<loc p1> = (int *) ((unsigned char *) <ptr> + 1 * sizeof(int))
--[red_cast]-->
Time 21: in function main, expression
<loc p1> = (int *) (<ptr> + 1 * sizeof(int))
--[red_sizeof]-->
Time 22: in function main, expression <loc p1> = (int *) (<ptr> + 1 * 4U)
--[red_binop]-->
Time 23: in function main, expression <loc p1> = (int *) (<ptr> + 4U)
--[red_binop]-->
Time 24: in function main, expression <loc p1> = (int *) <ptr>
--[red_cast]-->
Time 25: in function main, expression <loc p1> = <ptr>
--[red_assign]-->
Time 26: in function main, expression <ptr>
--[step_do_2]-->
Time 27: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 28: in function main, statement
p3 = (int *) ((unsigned char *) a + 3 * sizeof(int));
*p1 = 11;
*p3 = 33;
offset = (unsigned char *) p3 - (unsigned char *) p1;
q1 = (unsigned char *) p1;
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 29: in function main, statement
p3 = (int *) ((unsigned char *) a + 3 * sizeof(int));
--[step_do_1]-->
Time 30: in function main, expression
p3 = (int *) ((unsigned char *) a + 3 * sizeof(int))
--[red_var_local]-->
Time 31: in function main, expression
<loc p3> = (int *) ((unsigned char *) a + 3 * sizeof(int))
--[red_var_local]-->
Time 32: in function main, expression
<loc p3> = (int *) ((unsigned char *) <loc a> + 3 * sizeof(int))
--[red_rvalof]-->
Time 33: in function main, expression
<loc p3> = (int *) ((unsigned char *) <ptr> + 3 * sizeof(int))
--[red_cast]-->
Time 34: in function main, expression
<loc p3> = (int *) (<ptr> + 3 * sizeof(int))
--[red_sizeof]-->
Time 35: in function main, expression <loc p3> = (int *) (<ptr> + 3 * 4U)
--[red_binop]-->
Time 36: in function main, expression <loc p3> = (int *) (<ptr> + 12U)
--[red_binop]-->
Time 37: in function main, expression <loc p3> = (int *) <ptr>
--[red_cast]-->
Time 38: in function main, expression <loc p3> = <ptr>
--[red_assign]-->
Time 39: in function main, expression <ptr>
--[step_do_2]-->
Time 40: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 41: in function main, statement
*p1 = 11;
*p3 = 33;
offset = (unsigned char *) p3 - (unsigned char *) p1;
q1 = (unsigned char *) p1;
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 42: in function main, statement *p1 = 11;
--[step_do_1]-->
Time 43: in function main, expression *p1 = 11
--[red_var_local]-->
Time 44: in function main, expression *<loc p1> = 11
--[red_rvalof]-->
Time 45: in function main, expression *<ptr> = 11
--[red_deref]-->
Time 46: in function main, expression <loc> = 11
--[red_assign]-->
Time 47: in function main, expression 11
--[step_do_2]-->
Time 48: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 49: in function main, statement
*p3 = 33;
offset = (unsigned char *) p3 - (unsigned char *) p1;
q1 = (unsigned char *) p1;
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 50: in function main, statement *p3 = 33;
--[step_do_1]-->
Time 51: in function main, expression *p3 = 33
--[red_var_local]-->
Time 52: in function main, expression *<loc p3> = 33
--[red_rvalof]-->
Time 53: in function main, expression *<ptr> = 33
--[red_deref]-->
Time 54: in function main, expression <loc> = 33
--[red_assign]-->
Time 55: in function main, expression 33
--[step_do_2]-->
Time 56: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 57: in function main, statement
offset = (unsigned char *) p3 - (unsigned char *) p1;
q1 = (unsigned char *) p1;
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 58: in function main, statement
offset = (unsigned char *) p3 - (unsigned char *) p1;
--[step_do_1]-->
Time 59: in function main, expression
offset = (unsigned char *) p3 - (unsigned char *) p1
--[red_var_local]-->
Time 60: in function main, expression
<loc offset> = (unsigned char *) p3 - (unsigned char *) p1
--[red_var_local]-->
Time 61: in function main, expression
<loc offset> = (unsigned char *) <loc p3> - (unsigned char *) p1
--[red_rvalof]-->
Time 62: in function main, expression
<loc offset> = (unsigned char *) <ptr> - (unsigned char *) p1
--[red_cast]-->
Time 63: in function main, expression
<loc offset> = <ptr> - (unsigned char *) p1
--[red_var_local]-->
Time 64: in function main, expression
<loc offset> = <ptr> - (unsigned char *) <loc p1>
--[red_rvalof]-->
Time 65: in function main, expression
<loc offset> = <ptr> - (unsigned char *) <ptr>
--[red_cast]-->
Time 66: in function main, expression <loc offset> = <ptr> - <ptr>
--[red_binop]-->
Time 67: in function main, expression <loc offset> = 8
--[red_assign]-->
Time 68: in function main, expression 8
--[step_do_2]-->
Time 69: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 70: in function main, statement
q1 = (unsigned char *) p1;
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 71: in function main, statement q1 = (unsigned char *) p1;
--[step_do_1]-->
Time 72: in function main, expression q1 = (unsigned char *) p1
--[red_var_local]-->
Time 73: in function main, expression <loc q1> = (unsigned char *) p1
--[red_var_local]-->
Time 74: in function main, expression <loc q1> = (unsigned char *) <loc p1>
--[red_rvalof]-->
Time 75: in function main, expression <loc q1> = (unsigned char *) <ptr>
--[red_cast]-->
Time 76: in function main, expression <loc q1> = <ptr>
--[red_assign]-->
Time 77: in function main, expression <ptr>
--[step_do_2]-->
Time 78: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 79: in function main, statement
q3 = (unsigned char *) p1 + offset;
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 80: in function main, statement q3 = (unsigned char *) p1 + offset;
--[step_do_1]-->
Time 81: in function main, expression q3 = (unsigned char *) p1 + offset
--[red_var_local]-->
Time 82: in function main, expression
<loc q3> = (unsigned char *) p1 + offset
--[red_var_local]-->
Time 83: in function main, expression
<loc q3> = (unsigned char *) <loc p1> + offset
--[red_rvalof]-->
Time 84: in function main, expression
<loc q3> = (unsigned char *) <ptr> + offset
--[red_cast]-->
Time 85: in function main, expression <loc q3> = <ptr> + offset
--[red_var_local]-->
Time 86: in function main, expression <loc q3> = <ptr> + <loc offset>
--[red_rvalof]-->
Time 87: in function main, expression <loc q3> = <ptr> + 8
--[red_binop]-->
Time 88: in function main, expression <loc q3> = <ptr>
--[red_assign]-->
Time 89: in function main, expression <ptr>
--[step_do_2]-->
Time 90: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 91: in function main, statement
r1 = (int *) q1;
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 92: in function main, statement r1 = (int *) q1;
--[step_do_1]-->
Time 93: in function main, expression r1 = (int *) q1
--[red_var_local]-->
Time 94: in function main, expression <loc r1> = (int *) q1
--[red_var_local]-->
Time 95: in function main, expression <loc r1> = (int *) <loc q1>
--[red_rvalof]-->
Time 96: in function main, expression <loc r1> = (int *) <ptr>
--[red_cast]-->
Time 97: in function main, expression <loc r1> = <ptr>
--[red_assign]-->
Time 98: in function main, expression <ptr>
--[step_do_2]-->
Time 99: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 100: in function main, statement
r3 = (int *) q3;
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 101: in function main, statement r3 = (int *) q3;
--[step_do_1]-->
Time 102: in function main, expression r3 = (int *) q3
--[red_var_local]-->
Time 103: in function main, expression <loc r3> = (int *) q3
--[red_var_local]-->
Time 104: in function main, expression <loc r3> = (int *) <loc q3>
--[red_rvalof]-->
Time 105: in function main, expression <loc r3> = (int *) <ptr>
--[red_cast]-->
Time 106: in function main, expression <loc r3> = <ptr>
--[red_assign]-->
Time 107: in function main, expression <ptr>
--[step_do_2]-->
Time 108: in function main, statement /*skip*/;
--[step_skip_seq]-->
Time 109: in function main, statement
printf(__stringlit_1, a, (void *) p3, (void *) r3);
if (memcmp(&p3, &r3, sizeof(int *)) == 0) {
*r3 = 11;
printf(__stringlit_2, *., *., *., *.);
}
return 0;
--[step_seq]-->
Time 110: in function main, statement
printf(__stringlit_1, a, (void *) p3, (void *) r3);
--[step_do_1]-->
Time 111: in function main, expression
printf(__stringlit_1, a, (void *) p3, (void *) r3)
--[red_var_global]-->
Time 112: in function main, expression
printf(<loc __stringlit_1>, a, (void *) p3, (void *) r3)
--[red_rvalof]-->
Time 113: in function main, expression
printf(<ptr __stringlit_1>, a, (void *) p3, (void *) r3)
--[red_var_local]-->
Time 114: in function main, expression
printf(<ptr __stringlit_1>, <loc a>, (void *) p3, (void *) r3)
--[red_rvalof]-->
Time 115: in function main, expression
printf(<ptr __stringlit_1>, <ptr>, (void *) p3, (void *) r3)
--[red_var_local]-->
Time 116: in function main, expression
printf(<ptr __stringlit_1>, <ptr>, (void *) <loc p3>, (void *) r3)
--[red_rvalof]-->
Time 117: in function main, expression
printf(<ptr __stringlit_1>, <ptr>, (void *) <ptr>, (void *) r3)
--[red_cast]-->
Time 118: in function main, expression
printf(<ptr __stringlit_1>, <ptr>, <ptr>, (void *) r3)
--[red_var_local]-->
Time 119: in function main, expression
printf(<ptr __stringlit_1>, <ptr>, <ptr>, (void *) <loc r3>)
--[red_rvalof]-->
Time 120: in function main, expression
printf(<ptr __stringlit_1>, <ptr>, <ptr>, (void *) <ptr>)
--[red_cast]-->
Time 121: in function main, expression
printf(<ptr __stringlit_1>, <ptr>, <ptr>, <ptr>)
Addresses: a=<66+0> p3=<66+12> r3=<66+12>

Stuck state: in function main, expression
printf(<ptr __stringlit_1>, <ptr>, <ptr>, <ptr>)
Addresses: a=<66+0> p3=<66+12> r3=<66+12>

Stuck subexpression: printf(<ptr __stringlit_1>, <ptr>, <ptr>, <ptr>)
ERROR: Undefined behavior
In file included from pointer_offset_from_subtraction_within_malloc_int_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.