diff options
author | Vlad Tsyrklevich <vlad@tsyrklevich.net> | 2018-06-26 18:51:04 +0000 |
---|---|---|
committer | Vlad Tsyrklevich <vlad@tsyrklevich.net> | 2018-06-26 18:51:04 +0000 |
commit | 45aa866d1317655b2661f9dbebabcd306c501f36 (patch) | |
tree | 6d11ac2294cc21b4e72f73cf9dd4a99ffc0a7193 /test | |
parent | 7073422f240f868bd063c30349750b11450e15b9 (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')
-rw-r--r-- | test/cfi/cross-dso-diagnostic.cpp | 42 |
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 |