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 exc( @@ -575,4 +577,6 @@ TEST_F(ExceptionHandlerDeathTest, InstructionPointerMemoryMaxBound) { DeleteFileW(minidump_filename_wide.c_str()); } +#endif // !ADDRESS_SANITIZER + } // namespace