1ThreadSanitizer 2=============== 3 4Introduction 5------------ 6 7ThreadSanitizer is a tool that detects data races. It consists of a compiler 8instrumentation module and a run-time library. Typical slowdown introduced by 9ThreadSanitizer is about **5x-15x**. Typical memory overhead introduced by 10ThreadSanitizer is about **5x-10x**. 11 12How to build 13------------ 14 15Build LLVM/Clang with `CMake <http://llvm.org/docs/CMake.html>`_. 16 17Supported Platforms 18------------------- 19 20ThreadSanitizer is supported on the following OS: 21 22* Linux 23* NetBSD 24* FreeBSD 25 26Support for other 64-bit architectures is possible, contributions are welcome. 27Support for 32-bit platforms is problematic and is not planned. 28 29Usage 30----- 31 32Simply compile and link your program with ``-fsanitize=thread``. To get a 33reasonable performance add ``-O1`` or higher. Use ``-g`` to get file names 34and line numbers in the warning messages. 35 36Example: 37 38.. code-block:: console 39 40 % cat projects/compiler-rt/lib/tsan/lit_tests/tiny_race.c 41 #include <pthread.h> 42 int Global; 43 void *Thread1(void *x) { 44 Global = 42; 45 return x; 46 } 47 int main() { 48 pthread_t t; 49 pthread_create(&t, NULL, Thread1, NULL); 50 Global = 43; 51 pthread_join(t, NULL); 52 return Global; 53 } 54 55 $ clang -fsanitize=thread -g -O1 tiny_race.c 56 57If a bug is detected, the program will print an error message to stderr. 58Currently, ThreadSanitizer symbolizes its output using an external 59``addr2line`` process (this will be fixed in future). 60 61.. code-block:: bash 62 63 % ./a.out 64 WARNING: ThreadSanitizer: data race (pid=19219) 65 Write of size 4 at 0x7fcf47b21bc0 by thread T1: 66 #0 Thread1 tiny_race.c:4 (exe+0x00000000a360) 67 68 Previous write of size 4 at 0x7fcf47b21bc0 by main thread: 69 #0 main tiny_race.c:10 (exe+0x00000000a3b4) 70 71 Thread T1 (running) created at: 72 #0 pthread_create tsan_interceptors.cc:705 (exe+0x00000000c790) 73 #1 main tiny_race.c:9 (exe+0x00000000a3a4) 74 75``__has_feature(thread_sanitizer)`` 76------------------------------------ 77 78In some cases one may need to execute different code depending on whether 79ThreadSanitizer is enabled. 80:ref:`\_\_has\_feature <langext-__has_feature-__has_extension>` can be used for 81this purpose. 82 83.. code-block:: c 84 85 #if defined(__has_feature) 86 # if __has_feature(thread_sanitizer) 87 // code that builds only under ThreadSanitizer 88 # endif 89 #endif 90 91``__attribute__((no_sanitize("thread")))`` 92----------------------------------------------- 93 94Some code should not be instrumented by ThreadSanitizer. One may use the 95function attribute ``no_sanitize("thread")`` to disable instrumentation of plain 96(non-atomic) loads/stores in a particular function. ThreadSanitizer still 97instruments such functions to avoid false positives and provide meaningful stack 98traces. This attribute may not be supported by other compilers, so we suggest 99to use it together with ``__has_feature(thread_sanitizer)``. 100 101Blacklist 102--------- 103 104ThreadSanitizer supports ``src`` and ``fun`` entity types in 105:doc:`SanitizerSpecialCaseList`, that can be used to suppress data race reports 106in the specified source files or functions. Unlike functions marked with 107``no_sanitize("thread")`` attribute, blacklisted functions are not instrumented 108at all. This can lead to false positives due to missed synchronization via 109atomic operations and missed stack frames in reports. 110 111Limitations 112----------- 113 114* ThreadSanitizer uses more real memory than a native run. At the default 115 settings the memory overhead is 5x plus 1Mb per each thread. Settings with 3x 116 (less accurate analysis) and 9x (more accurate analysis) overhead are also 117 available. 118* ThreadSanitizer maps (but does not reserve) a lot of virtual address space. 119 This means that tools like ``ulimit`` may not work as usually expected. 120* Libc/libstdc++ static linking is not supported. 121* Non-position-independent executables are not supported. Therefore, the 122 ``fsanitize=thread`` flag will cause Clang to act as though the ``-fPIE`` 123 flag had been supplied if compiling without ``-fPIC``, and as though the 124 ``-pie`` flag had been supplied if linking an executable. 125 126Current Status 127-------------- 128 129ThreadSanitizer is in beta stage. It is known to work on large C++ programs 130using pthreads, but we do not promise anything (yet). C++11 threading is 131supported with llvm libc++. The test suite is integrated into CMake build 132and can be run with ``make check-tsan`` command. 133 134We are actively working on enhancing the tool --- stay tuned. Any help, 135especially in the form of minimized standalone tests is more than welcome. 136 137More Information 138---------------- 139`<https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual>`_ 140