diff --git a/mfbt/TsanOptions.h b/mfbt/TsanOptions.h new file mode 100644 index 000000000000..7d9cfe29f46d --- /dev/null +++ b/mfbt/TsanOptions.h @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Default options for ThreadSanitizer. */ + +#ifndef mozilla_TsanOptions_h +#define mozilla_TsanOptions_h + +#include "mozilla/Compiler.h" + +#ifndef _MSC_VER // Not supported by clang-cl yet + +// +// When running with ThreadSanitizer, we need to explicitly set some +// options specific to our codebase to prevent errors during runtime. +// To override these, set the TSAN_OPTIONS environment variable. +// +// Currently, these are: +// +// abort_on_error=1 - Causes TSan to abort instead of using exit(). +// halt_on_error=1 - Causes TSan to stop on the first race detected. +// +// report_signal_unsafe=0 - Required to avoid TSan deadlocks when +// receiving external signals (e.g. SIGINT manually on console). +// +// allocator_may_return_null=1 - Tell TSan to return NULL when an allocation +// fails instead of aborting the program. This allows us to handle failing +// allocations the same way we would handle them with a regular allocator and +// also uncovers potential bugs that might occur in these situations. +// +extern "C" const char* __tsan_default_options() { + return "halt_on_error=1:abort_on_error=1:report_signal_unsafe=0" + ":allocator_may_return_null=1"; +} + +// These are default suppressions for external libraries that probably +// every application would want to include if it potentially loads external +// libraries like GTK/X and hence their dependencies. +#define MOZ_TSAN_DEFAULT_EXTLIB_SUPPRESSIONS \ + "called_from_lib:libatk-1\n" \ + "called_from_lib:libcairo.so\n" \ + "called_from_lib:libcairo-gobject\n" \ + "called_from_lib:libgdk-3\n" \ + "called_from_lib:libgdk_pixbuf\n" \ + "called_from_lib:libgdk-x11\n" \ + "called_from_lib:libgio-2\n" \ + "called_from_lib:libglib-1\n" \ + "called_from_lib:libglib-2\n" \ + "called_from_lib:libgobject\n" \ + "called_from_lib:libgtk-3\n" \ + "called_from_lib:libgtk-x11\n" \ + "called_from_lib:libgvfscommon\n" \ + "called_from_lib:libgvfsdbus\n" \ + "called_from_lib:libibus-1\n" \ + "called_from_lib:libogg.so\n" \ + "called_from_lib:libpangocairo\n" \ + "called_from_lib:libpangoft2\n" \ + "called_from_lib:pango-basic-fc\n" \ + "called_from_lib:libpixman-1\n" \ + "called_from_lib:libpulse.so\n" \ + "called_from_lib:libpulsecommon\n" \ + "called_from_lib:libsecret-1\n" \ + "called_from_lib:libunity-gtk3-parser\n" \ + "called_from_lib:libvorbis.so\n" \ + "called_from_lib:libvorbisfile\n" \ + "called_from_lib:libX11.so\n" \ + "called_from_lib:libX11-xcb\n" \ + "called_from_lib:libXau\n" \ + "called_from_lib:libxcb.so\n" \ + "called_from_lib:libXcomposite\n" \ + "called_from_lib:libXcursor\n" \ + "called_from_lib:libXdamage\n" \ + "called_from_lib:libXdmcp\n" \ + "called_from_lib:libXext\n" \ + "called_from_lib:libXfixes\n" \ + "called_from_lib:libXi.so\n" \ + "called_from_lib:libXrandr\n" \ + "called_from_lib:libXrender\n" \ + "called_from_lib:libXss\n" + + +#endif // _MSC_VER + +#endif /* mozilla_TsanOptions_h */ diff --git a/mfbt/moz.build b/mfbt/moz.build index 37fbd7de0434..2eecabb277c4 100644 --- a/mfbt/moz.build +++ b/mfbt/moz.build @@ -142,6 +142,11 @@ elif CONFIG['OS_ARCH'] == 'Linux': 'LinuxSignal.h', ] +if CONFIG['MOZ_TSAN']: + EXPORTS.mozilla += [ + 'TsanOptions.h', + ] + UNIFIED_SOURCES += [ 'Assertions.cpp', 'ChaosMode.cpp', diff --git a/mozglue/build/TsanOptions.cpp b/mozglue/build/TsanOptions.cpp index 34de6557df11..ee01d299f6e4 100644 --- a/mozglue/build/TsanOptions.cpp +++ b/mozglue/build/TsanOptions.cpp @@ -4,32 +4,10 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mozilla/Attributes.h" +#include "mozilla/TsanOptions.h" #ifndef _MSC_VER // Not supported by clang-cl yet -// -// When running with ThreadSanitizer, we need to explicitly set some -// options specific to our codebase to prevent errors during runtime. -// To override these, set the TSAN_OPTIONS environment variable. -// -// Currently, these are: -// -// abort_on_error=1 - Causes TSan to abort instead of using exit(). -// halt_on_error=1 - Causes TSan to stop on the first race detected. -// -// report_signal_unsafe=0 - Required to avoid TSan deadlocks when -// receiving external signals (e.g. SIGINT manually on console). -// -// allocator_may_return_null=1 - Tell TSan to return NULL when an allocation -// fails instead of aborting the program. This allows us to handle failing -// allocations the same way we would handle them with a regular allocator and -// also uncovers potential bugs that might occur in these situations. -// -extern "C" const char* __tsan_default_options() { - return "halt_on_error=1:abort_on_error=1:report_signal_unsafe=0" - ":allocator_may_return_null=1"; -} - // // When running with ThreadSanitizer, we sometimes need to suppress existing // races. However, in any case, it should be either because @@ -56,46 +34,7 @@ extern "C" const char* __tsan_default_suppressions() { return "# Add your suppressions below\n" // External uninstrumented libraries - "called_from_lib:libatk-1\n" - "called_from_lib:libcairo.so\n" - "called_from_lib:libcairo-gobject\n" - "called_from_lib:libgdk-3\n" - "called_from_lib:libgdk_pixbuf\n" - "called_from_lib:libgdk-x11\n" - "called_from_lib:libgio-2\n" - "called_from_lib:libglib-1\n" - "called_from_lib:libglib-2\n" - "called_from_lib:libgobject\n" - "called_from_lib:libgtk-3\n" - "called_from_lib:libgtk-x11\n" - "called_from_lib:libgvfscommon\n" - "called_from_lib:libgvfsdbus\n" - "called_from_lib:libibus-1\n" - "called_from_lib:libogg.so\n" - "called_from_lib:libpangocairo\n" - "called_from_lib:libpangoft2\n" - "called_from_lib:pango-basic-fc\n" - "called_from_lib:libpixman-1\n" - "called_from_lib:libpulse.so\n" - "called_from_lib:libpulsecommon\n" - "called_from_lib:libsecret-1\n" - "called_from_lib:libunity-gtk3-parser\n" - "called_from_lib:libvorbis.so\n" - "called_from_lib:libvorbisfile\n" - "called_from_lib:libX11.so\n" - "called_from_lib:libX11-xcb\n" - "called_from_lib:libXau\n" - "called_from_lib:libxcb.so\n" - "called_from_lib:libXcomposite\n" - "called_from_lib:libXcursor\n" - "called_from_lib:libXdamage\n" - "called_from_lib:libXdmcp\n" - "called_from_lib:libXext\n" - "called_from_lib:libXfixes\n" - "called_from_lib:libXi.so\n" - "called_from_lib:libXrandr\n" - "called_from_lib:libXrender\n" - "called_from_lib:libXss\n" + MOZ_TSAN_DEFAULT_EXTLIB_SUPPRESSIONS // These libraries are uninstrumented and cause mutex false positives. // However, they can be unloaded by GTK early which we cannot avoid. diff --git a/toolkit/mozapps/update/updater/TsanOptions.cpp b/toolkit/mozapps/update/updater/TsanOptions.cpp new file mode 100644 index 000000000000..79f80a202b3c --- /dev/null +++ b/toolkit/mozapps/update/updater/TsanOptions.cpp @@ -0,0 +1,25 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/Attributes.h" +#include "mozilla/TsanOptions.h" + +#ifndef _MSC_VER // Not supported by clang-cl yet + +// See also mozglue/build/TsanOptions.cpp before modifying this +extern "C" const char* __tsan_default_suppressions() { + return "# Add your suppressions below\n" + + // External uninstrumented libraries + MOZ_TSAN_DEFAULT_EXTLIB_SUPPRESSIONS + + // Bug 1623034 + "race:QuitProgressUI\n" + "race:ShowProgressUI\n" + + // End of suppressions. + ; // Please keep this semicolon. +} +#endif // _MSC_VER diff --git a/toolkit/mozapps/update/updater/updater-common.build b/toolkit/mozapps/update/updater/updater-common.build index 6b79eb13e8e6..5898e92d465d 100644 --- a/toolkit/mozapps/update/updater/updater-common.build +++ b/toolkit/mozapps/update/updater/updater-common.build @@ -78,6 +78,13 @@ if have_progressui == 0: SOURCES += sorted(srcs) +if CONFIG['MOZ_TSAN']: + # Since mozglue is not linked to the updater, + # we need to include our own TSan suppression list. + SOURCES += [ + 'TsanOptions.cpp', + ] + DEFINES['NS_NO_XPCOM'] = True DisableStlWrapping() for var in ('MAR_CHANNEL_ID', 'MOZ_APP_VERSION'):