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