aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/asan/pointer-compare-1.c
blob: fb9126d6df1220fc906846baf7b5b07c06a5e7e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* { dg-do run } */
/* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2:halt_on_error=0" } */
/* { dg-options "-fsanitize=address,pointer-compare" } */

/* FIXME: remove me after PR sanitizer/82501 is resolved.  */
/* { dg-additional-options "-fno-section-anchors" } */
/* { dg-additional-options "-msdata=none" { target { powerpc*-*-* } } } */
/* { dg-additional-options "-msmall-data-limit=0" { target { riscv*-*-* } } } */

volatile int v;

__attribute__((noipa)) void
foo (char *p, char *q)
{
  v = p > q;
}

char __attribute__((used)) global1[100] = {};
char __attribute__((used)) global2[100] = {};
char __attribute__((used)) smallest_global[5] = {};
char __attribute__((used)) small_global[7] = {};
char __attribute__((used)) little_global[10] = {};
char __attribute__((used)) medium_global[4000] = {};
char __attribute__((used)) large_global[5000] = {};
char __attribute__((used)) largest_global[6000] = {};

int
main ()
{
  /* Heap allocated memory.  */
  char *heap1 = (char *)__builtin_malloc (42);
  char *heap2 = (char *)__builtin_malloc (42);

  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (heap1, heap2);
  __builtin_free (heap1);
  __builtin_free (heap2);

  heap1 = (char *)__builtin_malloc (1024);
  __asm ("" : "+g" (heap1));
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (heap1, heap1 + 1025);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (heap1 + 1024, heap1 + 1025);
  __builtin_free (heap1);

  heap1 = (char *)__builtin_malloc (4096);
  __asm ("" : "+g" (heap1));
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (heap1, heap1 + 4097);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (heap1, 0);

  /* Global variables.  */
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (&global1[0], &global2[10]);

  char *p = &small_global[0];
  __asm ("" : "+g" (p));
  foo (p, p); /* OK */
  foo (p, p + 7); /* OK */
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p, p + 8);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p - 1, p);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p, p - 1);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p - 1, p + 8);

  p = &large_global[0];
  __asm ("" : "+g" (p));
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p - 1, p);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p, p - 1);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p, &global1[0]);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p, &small_global[0]);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (p, 0);

  /* Stack variables.  */
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  char stack1, stack2;
  foo (&stack1, &stack2);

  /* Mixtures.  */
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (heap1, &stack1);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (heap1, &global1[0]);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
  foo (&stack1, &global1[0]);
  /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair" } */
  foo (&stack1, 0);
  __builtin_free (heap1);

  return 0;
}