diff options
Diffstat (limited to 'compiler-rt/test')
8 files changed, 154 insertions, 8 deletions
diff --git a/compiler-rt/test/asan/TestCases/Windows/basic_exception_handling.cpp b/compiler-rt/test/asan/TestCases/Windows/basic_exception_handling.cpp new file mode 100644 index 0000000..6f02814 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/Windows/basic_exception_handling.cpp @@ -0,0 +1,33 @@ +// RUN: %clangxx_asan %s -o %t +// RUN: %run %t | FileCheck %s + +// This test tests that declaring a parameter in a catch-block does not produce a false positive +// ASan error on Windows. + +// This code is based on the repro in https://github.com/google/sanitizers/issues/749 +#include <cstdio> +#include <exception> + +void throwInFunction() { throw std::exception("test2"); } + +int main() { + // case 1: direct throw + try { + throw std::exception("test1"); + } catch (const std::exception &ex) { + puts(ex.what()); + // CHECK: test1 + } + + // case 2: throw in function + try { + throwInFunction(); + } catch (const std::exception &ex) { + puts(ex.what()); + // CHECK: test2 + } + + printf("Success!\n"); + // CHECK: Success! + return 0; +} diff --git a/compiler-rt/test/asan/TestCases/wcscat.cpp b/compiler-rt/test/asan/TestCases/wcscat.cpp index fd0b5a4..beab1dc 100644 --- a/compiler-rt/test/asan/TestCases/wcscat.cpp +++ b/compiler-rt/test/asan/TestCases/wcscat.cpp @@ -9,11 +9,13 @@ int main() { const wchar_t *start = L"X means "; const wchar_t *append = L"dog"; - wchar_t goodDst[12]; + wchar_t goodArray[12]; + wchar_t *volatile goodDst = goodArray; wcscpy(goodDst, start); wcscat(goodDst, append); - wchar_t badDst[9]; + wchar_t badArray[9]; + wchar_t *volatile badDst = badArray; wcscpy(badDst, start); fprintf(stderr, "Good so far.\n"); // CHECK-DAG: Good so far. diff --git a/compiler-rt/test/asan/TestCases/wcscpy.cpp b/compiler-rt/test/asan/TestCases/wcscpy.cpp index 8133a58..2b82803 100644 --- a/compiler-rt/test/asan/TestCases/wcscpy.cpp +++ b/compiler-rt/test/asan/TestCases/wcscpy.cpp @@ -8,10 +8,12 @@ int main() { const wchar_t *src = L"X means dog"; - wchar_t goodDst[12]; + wchar_t goodArray[12]; + wchar_t *volatile goodDst = goodArray; wcscpy(goodDst, src); - wchar_t badDst[7]; + wchar_t badArray[7]; + wchar_t *volatile badDst = badArray; fprintf(stderr, "Good so far.\n"); // CHECK-DAG: Good so far. fflush(stderr); diff --git a/compiler-rt/test/asan/TestCases/wcsncat.cpp b/compiler-rt/test/asan/TestCases/wcsncat.cpp index 365e732..04cdcf2 100644 --- a/compiler-rt/test/asan/TestCases/wcsncat.cpp +++ b/compiler-rt/test/asan/TestCases/wcsncat.cpp @@ -9,11 +9,13 @@ int main() { const wchar_t *start = L"X means "; const wchar_t *append = L"dog"; - wchar_t goodDst[15]; + wchar_t goodArray[15]; + wchar_t *volatile goodDst = goodArray; wcscpy(goodDst, start); wcsncat(goodDst, append, 5); - wchar_t badDst[11]; + wchar_t badArray[11]; + wchar_t *volatile badDst = badArray; wcscpy(badDst, start); wcsncat(badDst, append, 1); fprintf(stderr, "Good so far.\n"); diff --git a/compiler-rt/test/asan/TestCases/wcsncpy.cpp b/compiler-rt/test/asan/TestCases/wcsncpy.cpp index 485ddc4..9e11b55 100644 --- a/compiler-rt/test/asan/TestCases/wcsncpy.cpp +++ b/compiler-rt/test/asan/TestCases/wcsncpy.cpp @@ -8,10 +8,12 @@ int main() { const wchar_t *src = L"X means dog"; - wchar_t goodDst[12]; + wchar_t goodArray[12]; + wchar_t *volatile goodDst = goodArray; wcsncpy(goodDst, src, 12); - wchar_t badDst[7]; + wchar_t badArray[7]; + wchar_t *volatile badDst = badArray; wcsncpy(badDst, src, 7); // This should still work. fprintf(stderr, "Good so far.\n"); // CHECK-DAG: Good so far. diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cpp index 1c74015..0c5a922 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cpp +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cpp @@ -23,6 +23,10 @@ // Flaky errors in debuggerd with "waitpid returned unexpected pid (0)" in logcat. // UNSUPPORTED: android && i386-target-arch +// Note: this test case is unusual because it retrieves the original +// (ASan-installed) signal handler; thus, it is incompatible with the +// cloak_sanitizer_signal_handlers runtime option. + #include <signal.h> #include <stdio.h> #include <stdlib.h> diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/cloak_sigaction.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/cloak_sigaction.cpp new file mode 100644 index 0000000..422e4ab --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/cloak_sigaction.cpp @@ -0,0 +1,53 @@ +// UNSUPPORTED: android +// UNSUPPORTED: hwasan + +// RUN: %clangxx -O0 %s -o %t + +// Sanitizer signal handler not installed; custom signal handler installed +// RUN: %env_tool_opts=handle_segv=0:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM +// RUN: %env_tool_opts=handle_segv=0:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM + +// Sanitizer signal handler installed but overriden by custom signal handler +// RUN: %env_tool_opts=handle_segv=1:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=NONDEFAULT,CUSTOM +// RUN: %env_tool_opts=handle_segv=1:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM + +// Sanitizer signal handler installed immutably +// N.B. for handle_segv=2 with cloaking off, there is a pre-existing difference +// in signal vs. sigaction: signal effectively cloaks the handler. +// RUN: %env_tool_opts=handle_segv=2:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=NONDEFAULT,SANITIZER +// RUN: %env_tool_opts=handle_segv=2:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,SANITIZER + +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> + +void handler(int signum, siginfo_t *info, void *context) { + printf("Custom signal handler\n"); + exit(1); +} + +int main(int argc, char *argv[]) { + struct sigaction sa = {0}; + struct sigaction old = {0}; + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = &handler; + sigaction(SIGSEGV, &sa, &old); + + if (reinterpret_cast<void *>(old.sa_sigaction) == SIG_DFL) + printf("Old handler: default\n"); + // DEFAULT: Old handler: default + else + printf("Old handler: non-default\n"); + // NONDEFAULT: Old handler: non-default + + fflush(stdout); + + // Trying to organically segfault by dereferencing a pointer can be tricky + // in builds with assertions. Additionally, some older platforms may SIGBUS + // instead. + raise(SIGSEGV); + // CUSTOM: Custom signal handler + // SANITIZER: Sanitizer:DEADLYSIGNAL + + return 0; +} diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/cloak_signal.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/cloak_signal.cpp new file mode 100644 index 0000000..48e5475 --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/cloak_signal.cpp @@ -0,0 +1,48 @@ +// UNSUPPORTED: android +// UNSUPPORTED: hwasan + +// RUN: %clangxx -O0 %s -o %t + +// Sanitizer signal handler not installed; custom signal handler installed +// RUN: %env_tool_opts=handle_segv=0:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM +// RUN: %env_tool_opts=handle_segv=0:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM + +// Sanitizer signal handler installed but overriden by custom signal handler +// RUN: %env_tool_opts=handle_segv=1:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=NONDEFAULT,CUSTOM +// RUN: %env_tool_opts=handle_segv=1:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM + +// Sanitizer signal handler installed immutably +// N.B. for handle_segv=2 with cloaking off, there is a pre-existing difference +// in signal vs. sigaction: signal effectively cloaks the handler. +// RUN: %env_tool_opts=handle_segv=2:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,SANITIZER +// RUN: %env_tool_opts=handle_segv=2:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,SANITIZER + +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> + +void my_signal_sighandler(int signum) { + printf("Custom signal handler\n"); + exit(1); +} + +int main(int argc, char *argv[]) { + __sighandler_t old = signal(SIGSEGV, &my_signal_sighandler); + if (old == SIG_DFL) + printf("Old handler: default\n"); + // DEFAULT: Old handler: default + else + printf("Old handler: non-default\n"); + // NONDEFAULT: Old handler: non-default + + fflush(stdout); + + // Trying to organically segfault by dereferencing a pointer can be tricky + // in builds with assertions. Additionally, some older platforms may SIGBUS + // instead. + raise(SIGSEGV); + // CUSTOM: Custom signal handler + // SANITIZER: Sanitizer:DEADLYSIGNAL + + return 0; +} |