76 lines · cpp
1// RUN: %clangxx_asan -O %s -o %t2// RUN: not %run %t crash 2>&1 | FileCheck --check-prefix=CHECK-CRASH %s3// RUN: not %run %t bad-bounds 2>&1 | FileCheck --check-prefix=CHECK-BAD-BOUNDS %s4// RUN: not %run %t unaligned-bad-bounds 2>&1 | FileCheck --check-prefix=CHECK-UNALIGNED-BAD-BOUNDS %s --implicit-check-not="beg is not aligned by"5// RUN: not %run %t odd-alignment 2>&1 | FileCheck --check-prefix=CHECK-CRASH %s6// RUN: not %run %t odd-alignment-end 2>&1 | FileCheck --check-prefix=CHECK-CRASH %s7// RUN: %env_asan_opts=detect_container_overflow=0 %run %t crash8//9// Test crash due to __sanitizer_annotate_contiguous_container.10 11#include <assert.h>12#include <string.h>13 14extern "C" {15void __sanitizer_annotate_contiguous_container(const void *beg, const void *end,16 const void *old_mid,17 const void *new_mid);18} // extern "C"19 20static volatile int one = 1;21 22int TestCrash() {23 long t[100];24 t[60] = 0;25 __sanitizer_annotate_contiguous_container(&t[0], &t[0] + 100, &t[0] + 100,26 &t[0] + 50);27// CHECK-CRASH: AddressSanitizer: container-overflow28// CHECK-CRASH: if you don't care about these errors you may set ASAN_OPTIONS=detect_container_overflow=029 return (int)t[60 * one]; // Touches the poisoned memory.30}31 32void BadBounds() {33 long t[100];34// CHECK-BAD-BOUNDS: ERROR: AddressSanitizer: bad parameters to __sanitizer_annotate_contiguous_container35 __sanitizer_annotate_contiguous_container(&t[0], &t[0] + 100, &t[0] + 101,36 &t[0] + 50);37}38 39void UnalignedBadBounds() {40 char t[100];41 // CHECK-UNALIGNED-BAD-BOUNDS: ERROR: AddressSanitizer: bad parameters to __sanitizer_annotate_contiguous_container42 __sanitizer_annotate_contiguous_container(&t[1], &t[0] + 100, &t[0] + 101,43 &t[0] + 50);44}45 46int OddAlignment() {47 int t[100];48 t[60] = 0;49 __sanitizer_annotate_contiguous_container(&t[1], &t[0] + 100, &t[0] + 100,50 &t[1] + 50);51 return (int)t[60 * one]; // Touches the poisoned memory.52}53 54int OddAlignmentEnd() {55 int t[99];56 t[60] = 0;57 __sanitizer_annotate_contiguous_container(&t[0], &t[0] + 98, &t[0] + 98,58 &t[0] + 50);59 return (int)t[60 * one]; // Touches the poisoned memory.60}61 62int main(int argc, char **argv) {63 assert(argc == 2);64 if (!strcmp(argv[1], "crash"))65 return TestCrash();66 else if (!strcmp(argv[1], "bad-bounds"))67 BadBounds();68 else if (!strcmp(argv[1], "unaligned-bad-bounds"))69 UnalignedBadBounds();70 else if (!strcmp(argv[1], "odd-alignment"))71 return OddAlignment();72 else if (!strcmp(argv[1], "odd-alignment-end"))73 return OddAlignmentEnd();74 return 0;75}76