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.
  |