blob: f543333a0c5d8229941674ba7b7f7ba67928647e [file] [log] [blame]
Sean Silva709c44d2012-12-12 23:44:55 +00001ThreadSanitizer
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
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +00009ThreadSanitizer is about **5x-15x**. Typical memory overhead introduced by
10ThreadSanitizer is about **5x-10x**.
Sean Silva709c44d2012-12-12 23:44:55 +000011
12How to build
13------------
14
15Follow the `Clang build instructions <../get_started.html>`_. CMake build is
16supported.
17
18Supported Platforms
19-------------------
20
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +000021ThreadSanitizer is supported on Linux x86_64 (tested on Ubuntu 10.04 and 12.04).
22Support for MacOS 10.7 (64-bit only) is planned for 2013. Support for 32-bit
Sean Silva709c44d2012-12-12 23:44:55 +000023platforms is problematic and not yet planned.
24
25Usage
26-----
27
Peter Collingbourne54d770c2013-04-09 04:35:11 +000028Simply compile and link your program with ``-fsanitize=thread``. To get a
29reasonable performance add ``-O1`` or higher. Use ``-g`` to get file names
30and line numbers in the warning messages.
Sean Silva709c44d2012-12-12 23:44:55 +000031
32Example:
33
34.. code-block:: c++
35
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +000036 % cat projects/compiler-rt/lib/tsan/lit_tests/tiny_race.c
Sean Silva709c44d2012-12-12 23:44:55 +000037 #include <pthread.h>
38 int Global;
39 void *Thread1(void *x) {
40 Global = 42;
41 return x;
42 }
43 int main() {
44 pthread_t t;
45 pthread_create(&t, NULL, Thread1, NULL);
46 Global = 43;
47 pthread_join(t, NULL);
48 return Global;
49 }
50
Peter Collingbourne54d770c2013-04-09 04:35:11 +000051 $ clang -fsanitize=thread -g -O1 tiny_race.c
Sean Silva709c44d2012-12-12 23:44:55 +000052
53If a bug is detected, the program will print an error message to stderr.
54Currently, ThreadSanitizer symbolizes its output using an external
55``addr2line`` process (this will be fixed in future).
56
57.. code-block:: bash
58
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +000059 % ./a.out
Sean Silva709c44d2012-12-12 23:44:55 +000060 WARNING: ThreadSanitizer: data race (pid=19219)
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +000061 Write of size 4 at 0x7fcf47b21bc0 by thread T1:
Sean Silva709c44d2012-12-12 23:44:55 +000062 #0 Thread1 tiny_race.c:4 (exe+0x00000000a360)
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +000063
Sean Silva709c44d2012-12-12 23:44:55 +000064 Previous write of size 4 at 0x7fcf47b21bc0 by main thread:
65 #0 main tiny_race.c:10 (exe+0x00000000a3b4)
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +000066
67 Thread T1 (running) created at:
68 #0 pthread_create tsan_interceptors.cc:705 (exe+0x00000000c790)
Sean Silva709c44d2012-12-12 23:44:55 +000069 #1 main tiny_race.c:9 (exe+0x00000000a3a4)
70
Dmitry Vyukova53767e2012-12-17 08:52:05 +000071``__has_feature(thread_sanitizer)``
72------------------------------------
73
74In some cases one may need to execute different code depending on whether
75ThreadSanitizer is enabled.
76:ref:`\_\_has\_feature <langext-__has_feature-__has_extension>` can be used for
77this purpose.
78
79.. code-block:: c
80
Kostya Serebryany4c0fc992013-02-26 06:58:27 +000081 #if defined(__has_feature)
82 # if __has_feature(thread_sanitizer)
Dmitry Vyukova53767e2012-12-17 08:52:05 +000083 // code that builds only under ThreadSanitizer
Kostya Serebryany4c0fc992013-02-26 06:58:27 +000084 # endif
Dmitry Vyukova53767e2012-12-17 08:52:05 +000085 #endif
86
Kostya Serebryany4c0fc992013-02-26 06:58:27 +000087``__attribute__((no_sanitize_thread))``
88-----------------------------------------------
89
90Some code should not be instrumented by ThreadSanitizer.
91One may use the function attribute
92:ref:`no_sanitize_thread <langext-thread_sanitizer>`
93to disable instrumentation of plain (non-atomic) loads/stores in a particular function.
94ThreadSanitizer may still instrument such functions to avoid false positives.
95This attribute may not be
96supported by other compilers, so we suggest to use it together with
Evgeniy Stepanovfd75a2ca2013-08-15 13:57:11 +000097``__has_feature(thread_sanitizer)``.
Kostya Serebryany4c0fc992013-02-26 06:58:27 +000098
Alexey Samsonov2de68332013-08-07 08:23:32 +000099Blacklist
100---------
101
102ThreadSanitizer supports ``src`` and ``fun`` entity types in
103:doc:`SanitizerSpecialCaseList`, that can be used to suppress data race reports in
104the specified source files or functions.
105
Sean Silva709c44d2012-12-12 23:44:55 +0000106Limitations
107-----------
108
109* ThreadSanitizer uses more real memory than a native run. At the default
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +0000110 settings the memory overhead is 5x plus 1Mb per each thread. Settings with 3x
111 (less accurate analysis) and 9x (more accurate analysis) overhead are also
112 available.
Sean Silva709c44d2012-12-12 23:44:55 +0000113* ThreadSanitizer maps (but does not reserve) a lot of virtual address space.
114 This means that tools like ``ulimit`` may not work as usually expected.
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +0000115* Libc/libstdc++ static linking is not supported.
Peter Collingbourne54d770c2013-04-09 04:35:11 +0000116* Non-position-independent executables are not supported. Therefore, the
117 ``fsanitize=thread`` flag will cause Clang to act as though the ``-fPIE``
118 flag had been supplied if compiling without ``-fPIC``, and as though the
119 ``-pie`` flag had been supplied if linking an executable.
Sean Silva709c44d2012-12-12 23:44:55 +0000120
121Current Status
122--------------
123
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +0000124ThreadSanitizer is in beta stage. It is known to work on large C++ programs
125using pthreads, but we do not promise anything (yet). C++11 threading is
Dmitry Vyukovca2d2e12012-12-17 13:07:35 +0000126supported with llvm libc++. The test suite is integrated into CMake build
Dmitry Vyukovbe66bf12012-12-17 07:16:54 +0000127and can be run with ``make check-tsan`` command.
Sean Silva709c44d2012-12-12 23:44:55 +0000128
129We are actively working on enhancing the tool --- stay tuned. Any help,
130especially in the form of minimized standalone tests is more than welcome.
131
132More Information
133----------------
134`http://code.google.com/p/thread-sanitizer <http://code.google.com/p/thread-sanitizer/>`_.
135