aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/breakpad_googletest_includes.h21
-rw-r--r--src/client/linux/handler/exception_handler_unittest.cc19
-rw-r--r--src/client/windows/unittests/exception_handler_death_test.cc4
3 files changed, 39 insertions, 5 deletions
diff --git a/src/breakpad_googletest_includes.h b/src/breakpad_googletest_includes.h
index 48a4cc1b..1cc324b2 100644
--- a/src/breakpad_googletest_includes.h
+++ b/src/breakpad_googletest_includes.h
@@ -33,4 +33,25 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/include/gmock/gmock.h"
+// If AddressSanitizer is used, NULL pointer dereferences generate SIGILL
+// (illegal instruction) instead of SIGSEGV (segmentation fault). Also,
+// the number of memory regions differs, so there is no point in running
+// this test if AddressSanitizer is used.
+//
+// Ideally we'd use this attribute to disable ASAN on a per-func basis,
+// but this doesn't seem to actually work, and it's changed names over
+// time. So just stick with disabling the actual tests.
+// http://crbug.com/304575
+//#define NO_ASAN __attribute__((no_sanitize_address))
+#if defined(__clang__) && defined(__has_feature)
+// Have to keep this check sep from above as newer gcc will barf on it.
+# if __has_feature(address_sanitizer)
+# define ADDRESS_SANITIZER
+# endif
+#elif defined(__GNUC__) && defined(__SANITIZE_ADDRESS__)
+# define ADDRESS_SANITIZER
+#else
+# undef ADDRESS_SANITIZER
+#endif
+
#endif // BREAKPAD_GOOGLETEST_INCLUDES_H__
diff --git a/src/client/linux/handler/exception_handler_unittest.cc b/src/client/linux/handler/exception_handler_unittest.cc
index cfd50bb3..976f9f41 100644
--- a/src/client/linux/handler/exception_handler_unittest.cc
+++ b/src/client/linux/handler/exception_handler_unittest.cc
@@ -191,6 +191,8 @@ static bool DoneCallback(const MinidumpDescriptor& descriptor,
return true;
}
+#ifndef ADDRESS_SANITIZER
+
void ChildCrash(bool use_fd) {
AutoTempDir temp_dir;
int fds[2] = {0};
@@ -242,6 +244,8 @@ TEST(ExceptionHandlerTest, ChildCrashWithFD) {
ASSERT_NO_FATAL_FAILURE(ChildCrash(true));
}
+#endif // !ADDRESS_SANITIZER
+
static bool DoneCallbackReturnFalse(const MinidumpDescriptor& descriptor,
void* context,
bool succeeded) {
@@ -283,6 +287,8 @@ static bool InstallRaiseSIGKILL() {
return sigaction(SIGSEGV, &sa, NULL) != -1;
}
+#ifndef ADDRESS_SANITIZER
+
static void CrashWithCallbacks(ExceptionHandler::FilterCallback filter,
ExceptionHandler::MinidumpCallback done,
string path) {
@@ -450,6 +456,8 @@ TEST(ExceptionHandlerTest, StackedHandlersUnhandledToBottom) {
ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL));
}
+#endif // !ADDRESS_SANITIZER
+
const unsigned char kIllegalInstruction[] = {
#if defined(__mips__)
// mfc2 zero,Impl - usually illegal in userspace.
@@ -731,10 +739,6 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {
unlink(minidump_path.c_str());
}
-// If AddressSanitizer is used, NULL pointer dereferences generate SIGILL
-// (illegal instruction) instead of SIGSEGV (segmentation fault). Also,
-// the number of memory regions differs, so there is no point in running
-// this test if AddressSanitizer is used.
#ifndef ADDRESS_SANITIZER
// Ensure that an extra memory block doesn't get added when the instruction
@@ -781,7 +785,8 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryNullPointer) {
unlink(minidump_path.c_str());
}
-#endif // !ADDRESS_SANITIZER
+
+#endif // !ADDRESS_SANITIZER
// Test that anonymous memory maps can be annotated with names and IDs.
TEST(ExceptionHandlerTest, ModuleInfo) {
@@ -902,6 +907,8 @@ CrashHandler(const void* crash_context, size_t crash_context_size,
return true;
}
+#ifndef ADDRESS_SANITIZER
+
TEST(ExceptionHandlerTest, ExternalDumper) {
int fds[2];
ASSERT_NE(socketpair(AF_UNIX, SOCK_DGRAM, 0, fds), -1);
@@ -974,6 +981,8 @@ TEST(ExceptionHandlerTest, ExternalDumper) {
unlink(templ.c_str());
}
+#endif // !ADDRESS_SANITIZER
+
TEST(ExceptionHandlerTest, WriteMinidumpExceptionStream) {
AutoTempDir temp_dir;
ExceptionHandler handler(MinidumpDescriptor(temp_dir.path()), NULL, NULL,
diff --git a/src/client/windows/unittests/exception_handler_death_test.cc b/src/client/windows/unittests/exception_handler_death_test.cc
index 3a16e525..079ca3d6 100644
--- a/src/client/windows/unittests/exception_handler_death_test.cc
+++ b/src/client/windows/unittests/exception_handler_death_test.cc
@@ -307,6 +307,8 @@ wstring find_minidump_in_directory(const wstring &directory) {
return filename;
}
+#ifndef ADDRESS_SANITIZER
+
TEST_F(ExceptionHandlerDeathTest, InstructionPointerMemory) {
ASSERT_TRUE(DoesPathExist(temp_path_));
scoped_ptr<google_breakpad::ExceptionHandler> exc(
@@ -575,4 +577,6 @@ TEST_F(ExceptionHandlerDeathTest, InstructionPointerMemoryMaxBound) {
DeleteFileW(minidump_filename_wide.c_str());
}
+#endif // !ADDRESS_SANITIZER
+
} // namespace