Android links the unwinder library to every DSO. The problem is, unwinder has global state, and hwasan implementation of personality function wrapper happens to rub it the wrong way. Switch the test to static libc++ as a temporary workaround. llvm-svn: 375471
70 lines
1.9 KiB
C++
70 lines
1.9 KiB
C++
// This test is broken with shared libstdc++ / libc++ on Android.
|
|
// RUN: %clangxx_hwasan -static-libstdc++ %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=GOOD
|
|
// RUN: %clangxx_hwasan -static-libstdc++ -DNO_SANITIZE_F %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=GOOD
|
|
// RUN: %clangxx_hwasan_oldrt -static-libstdc++ %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=GOOD
|
|
// RUN: %clangxx_hwasan_oldrt -static-libstdc++ %s -mllvm -hwasan-instrument-landing-pads=0 -o %t && not %run %t 2>&1 | FileCheck %s --check-prefix=BAD
|
|
|
|
// C++ tests on x86_64 require instrumented libc++/libstdc++.
|
|
// REQUIRES: aarch64-target-arch
|
|
|
|
#include <stdexcept>
|
|
#include <cstdio>
|
|
|
|
static void optimization_barrier(void* arg) {
|
|
asm volatile("" : : "r"(arg) : "memory");
|
|
}
|
|
|
|
__attribute__((noinline))
|
|
void h() {
|
|
char x[1000];
|
|
optimization_barrier(x);
|
|
throw std::runtime_error("hello");
|
|
}
|
|
|
|
__attribute__((noinline))
|
|
void g() {
|
|
char x[1000];
|
|
optimization_barrier(x);
|
|
h();
|
|
optimization_barrier(x);
|
|
}
|
|
|
|
__attribute__((noinline))
|
|
void hwasan_read(char *p, int size) {
|
|
char volatile sink;
|
|
for (int i = 0; i < size; ++i)
|
|
sink = p[i];
|
|
}
|
|
|
|
__attribute__((noinline, no_sanitize("hwaddress"))) void after_catch() {
|
|
char x[10000];
|
|
hwasan_read(&x[0], sizeof(x));
|
|
}
|
|
|
|
|
|
__attribute__((noinline))
|
|
#ifdef NO_SANITIZE_F
|
|
__attribute__((no_sanitize("hwaddress")))
|
|
#endif
|
|
void f() {
|
|
char x[1000];
|
|
try {
|
|
// Put two tagged frames on the stack, throw an exception from the deepest one.
|
|
g();
|
|
} catch (const std::runtime_error &e) {
|
|
// Put an untagged frame on stack, check that it is indeed untagged.
|
|
// This relies on exception support zeroing out stack tags.
|
|
// BAD: tag-mismatch
|
|
after_catch();
|
|
// Check that an in-scope stack allocation is still tagged.
|
|
// This relies on exception support not zeroing too much.
|
|
hwasan_read(&x[0], sizeof(x));
|
|
// GOOD: hello
|
|
printf("%s\n", e.what());
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
f();
|
|
}
|