108 lines · cpp
1// RUN: %clangxx_asan -O0 %s -o %t -mllvm -asan-detect-invalid-pointer-pair2 3// RUN: %env_asan_opts=detect_invalid_pointer_pairs=2:halt_on_error=0 %run %t 2>&1 | FileCheck %s4// XFAIL: msvc5#include <assert.h>6#include <stdlib.h>7 8int foo(char *p, char *q) {9 return p > q;10}11 12char global1[100] = {}, global2[100] = {};13char __attribute__((used)) smallest_global[5] = {};14char small_global[7] = {};15char __attribute__((used)) little_global[10] = {};16char __attribute__((used)) medium_global[4000] = {};17char large_global[5000] = {};18char __attribute__((used)) largest_global[6000] = {};19 20int main() {21 // Heap allocated memory.22 char *heap1 = (char *)malloc(42);23 char *heap2 = (char *)malloc(42);24 25 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair26 // 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-pair33 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]34 foo(heap1, heap1 + 1025);35 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair36 // 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-pair42 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]43 foo(heap1, heap1 + 4097);44 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair45 // 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-pair50 // 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); // OK55 foo(p, p + 7); // OK56 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair57 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]58 foo(p, p + 8);59 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair60 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]61 foo(p - 1, p);62 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair63 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]64 foo(p, p - 1);65 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair66 // 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-pair71 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]72 foo(p - 1, p);73 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair74 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]75 foo(p, p - 1);76 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair77 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]78 foo(p, &global1[0]);79 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair80 // 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-pair83 // 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-pair89 // 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-pair94 // CHECK: #{{[0-9]+ .*}} in main {{.*}}invalid-pointer-pairs-compare-errors.cpp:[[@LINE+1]]95 foo(heap1, &stack1);96 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair97 foo(heap1, &global1[0]);98 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair99 foo(&stack1, &global1[0]);100 // CHECK: ERROR: AddressSanitizer: invalid-pointer-pair101 // 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