xref: /llvm-project/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-compare-errors.cpp (revision 673dc3d4a0b0fbb3b9b34ae2ecbfa522627fe582)
1 // RUN: %clangxx_asan -O0 %s -o %t -mllvm -asan-detect-invalid-pointer-pair
2 
3 // RUN: %env_asan_opts=detect_invalid_pointer_pairs=2:halt_on_error=0 %run %t 2>&1 | FileCheck %s
4 
5 #include <assert.h>
6 #include <stdlib.h>
7 
foo(char * p,char * q)8 int foo(char *p, char *q) {
9   return p > q;
10 }
11 
12 char global1[100] = {}, global2[100] = {};
13 char __attribute__((used)) smallest_global[5] = {};
14 char small_global[7] = {};
15 char __attribute__((used)) little_global[10] = {};
16 char __attribute__((used)) medium_global[4000] = {};
17 char large_global[5000] = {};
18 char __attribute__((used)) largest_global[6000] = {};
19 
main()20 int main() {
21   // Heap allocated memory.
22   char *heap1 = (char *)malloc(42);
23   char *heap2 = (char *)malloc(42);
24 
25   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
26   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
27   foo(heap1, heap2);
28   free(heap1);
29   free(heap2);
30 
31   heap1 = (char *)malloc(1024);
32   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
33   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
34   foo(heap1, heap1 + 1025);
35   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
36   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
37   foo(heap1 + 1024, heap1 + 1025);
38   free(heap1);
39 
40   heap1 = (char *)malloc(4096);
41   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
42   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
43   foo(heap1, heap1 + 4097);
44   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
45   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
46   foo(heap1, 0);
47 
48   // Global variables.
49   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
50   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
51   foo(&global1[0], &global2[10]);
52 
53   char *p = &small_global[0];
54   foo(p, p); // OK
55   foo(p, p + 7); // OK
56   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
57   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
58   foo(p, p + 8);
59   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
60   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
61   foo(p - 1, p);
62   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
63   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
64   foo(p, p - 1);
65   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
66   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
67   foo(p - 1, p + 8);
68 
69   p = &large_global[0];
70   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
71   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
72   foo(p - 1, p);
73   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
74   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
75   foo(p, p - 1);
76   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
77   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
78   foo(p, &global1[0]);
79   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
80   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
81   foo(p, &small_global[0]);
82   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
83   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
84   foo(p, 0);
85 
86   // Stack variables.
87   char stack1, stack2;
88   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
89   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
90   foo(&stack1, &stack2);
91 
92   // Mixtures.
93   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
94   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
95   foo(heap1, &stack1);
96   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
97   foo(heap1, &global1[0]);
98   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
99   foo(&stack1, &global1[0]);
100   // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
101   // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]
102   foo(&stack1, 0);
103 
104   free(heap1);
105 
106   return 0;
107 }
108