summaryrefslogtreecommitdiff
path: root/test/cfi
diff options
context:
space:
mode:
authorVlad Tsyrklevich <vlad@tsyrklevich.net>2018-06-26 18:51:04 +0000
committerVlad Tsyrklevich <vlad@tsyrklevich.net>2018-06-26 18:51:04 +0000
commit45aa866d1317655b2661f9dbebabcd306c501f36 (patch)
tree6d11ac2294cc21b4e72f73cf9dd4a99ffc0a7193 /test/cfi
parent7073422f240f868bd063c30349750b11450e15b9 (diff)
CFI: Print DSO names for failed cross-DSO icalls
Reviewers: pcc Reviewed By: pcc Subscribers: kubamracek, delcypher, llvm-commits, kcc, #sanitizers Differential Revision: https://reviews.llvm.org/D48583 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@335644 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/cfi')
-rw-r--r--test/cfi/cross-dso-diagnostic.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/cfi/cross-dso-diagnostic.cpp b/test/cfi/cross-dso-diagnostic.cpp
new file mode 100644
index 000000000..7a28d2fd1
--- /dev/null
+++ b/test/cfi/cross-dso-diagnostic.cpp
@@ -0,0 +1,42 @@
+// Check that cross-DSO diagnostics print the names of both modules
+
+// RUN: %clangxx_cfi_diag -g -DSHARED_LIB -fPIC -shared -o %t_dso_suffix %s
+// RUN: %clangxx_cfi_diag -g -o %t_exe_suffix %s -ldl
+// RUN: %t_exe_suffix %t_dso_suffix 2>&1 | FileCheck %s
+
+// UNSUPPORTED: win32
+// REQUIRES: cxxabi
+
+#include <dlfcn.h>
+#include <stdio.h>
+
+struct S1 {
+ virtual void f1();
+};
+
+#ifdef SHARED_LIB
+
+void S1::f1() {}
+
+__attribute__((visibility("default"))) extern "C"
+void* dso_symbol() { return new S1(); }
+
+#else
+
+int main(int argc, char *argv[]) {
+ void *handle = dlopen(argv[1], RTLD_NOW);
+
+ // CHECK: runtime error: control flow integrity check for type 'void *()' failed during indirect function call
+ // CHECK: dso_symbol defined here
+ // CHECK: check failed in {{.*}}_exe_suffix, destination function located in {{.*}}_dso_suffix
+ void* (*fp)(void) =
+ reinterpret_cast<void*(*)(void)>(dlsym(handle, "dso_symbol"));
+ void *S = fp(); // trigger cfi-icall failure
+
+ // CHECK: runtime error: control flow integrity check for type 'S1' failed during cast to unrelated type
+ // CHECK: invalid vtable
+ // CHECK: check failed in {{.*}}_exe_suffix, vtable located in {{.*}}_dso_suffix
+ S1 *Scast = reinterpret_cast<S1*>(S); // trigger cfi-unrelated-cast failure
+}
+
+#endif // SHARED_LIB