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
main()14*673dc3d4SNico Weber int main() {
15*673dc3d4SNico Weber // Heap allocated memory.
16*673dc3d4SNico Weber char *heap1 = (char *)malloc(42);
17*673dc3d4SNico Weber char *heap2 = (char *)malloc(42);
18*673dc3d4SNico Weber
19*673dc3d4SNico Weber // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
20*673dc3d4SNico Weber // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-subtract-errors.cpp:[[@LINE+1]]
21*673dc3d4SNico Weber foo(heap1, heap2);
22*673dc3d4SNico Weber
23*673dc3d4SNico Weber // Global variables.
24*673dc3d4SNico Weber // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
25*673dc3d4SNico Weber // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-subtract-errors.cpp:[[@LINE+1]]
26*673dc3d4SNico Weber foo(&global1[0], &global2[10]);
27*673dc3d4SNico Weber
28*673dc3d4SNico Weber // Stack variables.
29*673dc3d4SNico Weber char stack1, stack2;
30*673dc3d4SNico Weber // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
31*673dc3d4SNico Weber // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-subtract-errors.cpp:[[@LINE+1]]
32*673dc3d4SNico Weber foo(&stack1, &stack2);
33*673dc3d4SNico Weber
34*673dc3d4SNico Weber // Mixtures.
35*673dc3d4SNico Weber // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
36*673dc3d4SNico Weber // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-subtract-errors.cpp:[[@LINE+1]]
37*673dc3d4SNico Weber foo(heap1, &stack1);
38*673dc3d4SNico Weber // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
39*673dc3d4SNico Weber // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-subtract-errors.cpp:[[@LINE+1]]
40*673dc3d4SNico Weber foo(heap1, &global1[0]);
41*673dc3d4SNico Weber // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair
42*673dc3d4SNico Weber // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-subtract-errors.cpp:[[@LINE+1]]
43*673dc3d4SNico Weber foo(&stack1, &global1[0]);
44*673dc3d4SNico Weber
45*673dc3d4SNico Weber free(heap1);
46*673dc3d4SNico Weber free(heap2);
47*673dc3d4SNico Weber return 0;
48*673dc3d4SNico Weber }
49