/* { dg-do run } */ /* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2 halt_on_error=1" } */ /* { dg-options "-fsanitize=address,pointer-compare" } */ volatile int v; int foo (char *p) { char *p2 = p + 20; v = p > p2; return v; } void bar (char *p, char *q) { v = p <= q; } void baz (char *p, char *q) { v = (p != 0 && p < q); } char global[8192] = {}; char small_global[7] = {}; int main () { /* Heap allocated memory. */ char *p = (char *)__builtin_malloc (42); int r = foo (p); __builtin_free (p); p = (char *)__builtin_malloc (1024); bar (p, p + 1024); bar (p + 1024, p + 1023); bar (p + 1, p + 1023); __builtin_free (p); p = (char *)__builtin_malloc (4096); bar (p, p + 4096); bar (p + 10, p + 100); bar (p + 1024, p + 4096); bar (p + 4095, p + 4096); bar (p + 4095, p + 4094); bar (p + 100, p + 4096); bar (p + 100, p + 4094); __builtin_free (p); /* Global variable. */ bar (&global[0], &global[1]); bar (&global[1], &global[2]); bar (&global[2], &global[1]); bar (&global[0], &global[100]); bar (&global[1000], &global[7000]); bar (&global[500], &global[10]); p = &global[0]; bar (p, p + 8192); p = &global[8000]; bar (p, p + 192); p = &small_global[0]; bar (p, p + 1); bar (p, p + 7); bar (p + 7, p + 1); bar (p + 6, p + 7); bar (p + 7, p + 7); /* Stack variable. */ char stack[10000]; bar (&stack[0], &stack[100]); bar (&stack[1000], &stack[9000]); bar (&stack[500], &stack[10]); baz (0, &stack[10]); return 0; }