brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · b88e02b Raw
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