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