summaryrefslogtreecommitdiff
path: root/test/hwasan
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2019-05-16 23:54:41 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2019-05-16 23:54:41 +0000
commit33fd55dc71763acab367a570224382b3ccc45270 (patch)
treea1fc27a856d827b2fb263d8481436972794d4265 /test/hwasan
parent9307ebf67cc95721cea89f6f94bd8919443ed8bc (diff)
downloadcompiler-rt-33fd55dc71763acab367a570224382b3ccc45270.tar.gz
HWASan exception support.
Summary: Adds a call to __hwasan_handle_vfork(SP) at each landingpad entry. Reusing __hwasan_handle_vfork instead of introducing a new runtime call in order to be ABI-compatible with old runtime library. Reviewers: pcc Subscribers: kubamracek, hiraditya, #sanitizers, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D61968 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@360959 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/hwasan')
-rw-r--r--test/hwasan/TestCases/try-catch.cc60
1 files changed, 60 insertions, 0 deletions
diff --git a/test/hwasan/TestCases/try-catch.cc b/test/hwasan/TestCases/try-catch.cc
new file mode 100644
index 000000000..68b9011a2
--- /dev/null
+++ b/test/hwasan/TestCases/try-catch.cc
@@ -0,0 +1,60 @@
+// RUN: %clangxx_hwasan %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=GOOD
+// RUN: %clangxx_hwasan %s -mllvm -hwasan-instrument-landing-pads=0 -o %t && not %run %t 2>&1 | FileCheck %s --check-prefix=BAD
+
+#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))
+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();
+}