brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 21bb8ca Raw
102 lines · cpp
1// This test is broken with shared libstdc++ / libc++ on Android.2// RUN: %clangxx_hwasan -static-libstdc++ %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=GOOD3// RUN: %clangxx_hwasan -static-libstdc++ -DMALLOCEDSTACK %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=GOOD4// RUN: %clangxx_hwasan -static-libstdc++ -DNO_SANITIZE_F %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=GOOD5// RUN: %clangxx_hwasan_oldrt -static-libstdc++ %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=GOOD6// RUN: %clangxx_hwasan_oldrt -static-libstdc++ %s -mllvm -hwasan-instrument-landing-pads=0 -o %t && not %run %t 2>&1 | FileCheck %s --check-prefix=BAD7 8// C++ tests on x86_64 require instrumented libc++/libstdc++.9// RISC-V target doesn't support oldrt10// REQUIRES: aarch64-target-arch11 12#include <cassert>13#include <cstdio>14#include <errno.h>15#include <limits.h>16#include <pthread.h>17#include <sanitizer/hwasan_interface.h>18#include <stdexcept>19#include <string.h>20 21static void optimization_barrier(void* arg) {22  asm volatile("" : : "r"(arg) : "memory");23}24 25__attribute__((noinline))26void h() {27  char x[1000];28  optimization_barrier(x);29  throw std::runtime_error("hello");30}31 32__attribute__((noinline))33void g() {34  char x[1000];35  optimization_barrier(x);36  h();37  optimization_barrier(x);38}39 40__attribute__((noinline))41void hwasan_read(char *p, int size) {42  char volatile sink;43  for (int i = 0; i < size; ++i)44    sink = p[i];45}46 47__attribute__((noinline, no_sanitize("hwaddress"))) void after_catch() {48  char x[10000];49  hwasan_read(&x[0], sizeof(x));50}51 52__attribute__((noinline))53#ifdef NO_SANITIZE_F54__attribute__((no_sanitize("hwaddress")))55#endif56void *57f(void *) {58  char x[1000];59  try {60    // Put two tagged frames on the stack, throw an exception from the deepest one.61    g();62  } catch (const std::runtime_error &e) {63    // Put an untagged frame on stack, check that it is indeed untagged.64    // This relies on exception support zeroing out stack tags.65    // BAD: tag-mismatch66    after_catch();67    // Check that an in-scope stack allocation is still tagged.68    // This relies on exception support not zeroing too much.69    hwasan_read(&x[0], sizeof(x));70    // GOOD: hello71    printf("%s\n", e.what());72  }73  return nullptr;74}75 76int main() {77  __hwasan_enable_allocator_tagging();78#ifdef MALLOCEDSTACK79  pthread_attr_t attr;80  void *stack = malloc(PTHREAD_STACK_MIN);81  assert(pthread_attr_init(&attr) == 0);82  if (pthread_attr_setstack(&attr, stack, PTHREAD_STACK_MIN) != 0) {83    fprintf(stderr, "pthread_attr_setstack: %s", strerror(errno));84    abort();85  }86  pthread_t thid;87  if (pthread_create(&thid, &attr, f, nullptr) != 0) {88    fprintf(stderr, "pthread_create: %s", strerror(errno));89    abort();90  }91  void *ret;92  if (pthread_join(thid, &ret) != 0) {93    fprintf(stderr, "pthread_join: %s", strerror(errno));94    abort();95  }96  assert(pthread_attr_destroy(&attr) == 0);97  free(stack);98#else99  f(nullptr);100#endif101}102