[compiler-rt] r360959 - HWASan exception support.

Evgeniy Stepanov via llvm-commits llvm-commits at lists.llvm.org
Thu May 16 16:54:42 PDT 2019


Author: eugenis
Date: Thu May 16 16:54:41 2019
New Revision: 360959

URL: http://llvm.org/viewvc/llvm-project?rev=360959&view=rev
Log:
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

Added:
    compiler-rt/trunk/test/hwasan/TestCases/try-catch.cc

Added: compiler-rt/trunk/test/hwasan/TestCases/try-catch.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/hwasan/TestCases/try-catch.cc?rev=360959&view=auto
==============================================================================
--- compiler-rt/trunk/test/hwasan/TestCases/try-catch.cc (added)
+++ compiler-rt/trunk/test/hwasan/TestCases/try-catch.cc Thu May 16 16:54:41 2019
@@ -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();
+}




More information about the llvm-commits mailing list