1 /* { dg-do run } */
2 /* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2:halt_on_error=0" } */
3 /* { dg-options "-fsanitize=address,pointer-compare" } */
4 
5 /* FIXME: remove me after PR sanitizer/82501 is resolved.  */
6 /* { dg-additional-options "-fno-section-anchors" } */
7 /* { dg-additional-options "-msdata=none" { target { powerpc*-*-* } } } */
8 
9 volatile int v;
10 
11 __attribute__((noipa)) void
foo(char * p,char * q)12 foo (char *p, char *q)
13 {
14   v = p > q;
15 }
16 
17 char global1[100] = {}, global2[100] = {};
18 char __attribute__((used)) smallest_global[5] = {};
19 char small_global[7] = {};
20 char __attribute__((used)) little_global[10] = {};
21 char __attribute__((used)) medium_global[4000] = {};
22 char large_global[5000] = {};
23 char __attribute__((used)) largest_global[6000] = {};
24 
25 int
main()26 main ()
27 {
28   /* Heap allocated memory.  */
29   char *heap1 = (char *)__builtin_malloc (42);
30   char *heap2 = (char *)__builtin_malloc (42);
31 
32   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
33   foo (heap1, heap2);
34   __builtin_free (heap1);
35   __builtin_free (heap2);
36 
37   heap1 = (char *)__builtin_malloc (1024);
38   __asm ("" : "+g" (heap1));
39   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
40   foo (heap1, heap1 + 1025);
41   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
42   foo (heap1 + 1024, heap1 + 1025);
43   __builtin_free (heap1);
44 
45   heap1 = (char *)__builtin_malloc (4096);
46   __asm ("" : "+g" (heap1));
47   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
48   foo (heap1, heap1 + 4097);
49   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
50   foo (heap1, 0);
51 
52   /* Global variables.  */
53   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
54   foo (&global1[0], &global2[10]);
55 
56   char *p = &small_global[0];
57   __asm ("" : "+g" (p));
58   foo (p, p); /* OK */
59   foo (p, p + 7); /* OK */
60   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
61   foo (p, p + 8);
62   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
63   foo (p - 1, p);
64   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
65   foo (p, p - 1);
66   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
67   foo (p - 1, p + 8);
68 
69   p = &large_global[0];
70   __asm ("" : "+g" (p));
71   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
72   foo (p - 1, p);
73   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
74   foo (p, p - 1);
75   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
76   foo (p, &global1[0]);
77   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
78   foo (p, &small_global[0]);
79   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
80   foo (p, 0);
81 
82   /* Stack variables.  */
83   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
84   char stack1, stack2;
85   foo (&stack1, &stack2);
86 
87   /* Mixtures.  */
88   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
89   foo (heap1, &stack1);
90   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
91   foo (heap1, &global1[0]);
92   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */
93   foo (&stack1, &global1[0]);
94   /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair" } */
95   foo (&stack1, 0);
96   __builtin_free (heap1);
97 
98   return 0;
99 }
100