1#
2# Suppression patterns for ld, the dynamic loader.
3#
4
5# Suppress all data races triggered by ld.
6{
7   drd-ld
8   drd:ConflictingAccess
9   obj:*/lib*/ld-*.so
10}
11
12#
13# Suppression patterns for libc.
14#
15
16# Suppress all data races where the topmost frame is inside libc.so. Although
17# this could hide some real data races, unfortunately this is the only way to
18# not report any false positives on stdio functions. The glibc functions
19# manipulating FILE objects use locking primitives that cannot be intercepted
20# easily. See also the definitions of _IO_lock_lock() etc. in the file
21# nptl/sysdeps/pthread/bits/stdio-lock.h in the glibc source tree.
22{
23   drd-libc-stdio
24   drd:ConflictingAccess
25   obj:*/lib*/libc-*
26}
27{
28   drd-libc-thread-cancellation-test
29   drd:ConflictingAccess
30   fun:write
31}
32{
33   drd-libc-random
34   drd:ConflictingAccess
35   fun:random_r
36   fun:random
37}
38
39#
40# Suppression patterns for libstdc++, the implementation of the standard C++
41# library included with the gcc compiler.
42#
43# Note: several versions of the libstdc++ library (4.2.2, 4.3.2, 4.4.0, 4.5.0
44# and their predecessors) contain an implementation of the std::string class
45# that triggers conflicting memory accesses. See also
46# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40518
47#
48
49# {
50#    drd-libstdc++-std::string::string()
51#    drd:ConflictingAccess
52#    fun:_ZNSsC1ERKSs
53# }
54
55{
56   drd-libstdc++-cxa_guard_release
57   drd:CondErr
58   fun:pthread_cond_broadcast@*
59   fun:__cxa_guard_release
60}
61{
62   drd-libstdc++-std::__ostream_insert()
63   drd:ConflictingAccess
64   fun:_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
65   fun:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
66}
67{
68   drd-libstdc++-std::ostream::_M_insert<long>()
69   drd:ConflictingAccess
70   ...
71   fun:_ZNSo9_M_insertIlEERSoT_
72}
73
74
75#
76# Suppression patterns for libpthread.
77#
78
79{
80   drd-libpthread-pthread_create
81   drd:ConflictingAccess
82   ...
83   fun:pthread_create*
84}
85{
86   drd-libpthread-pthread_join
87   drd:ConflictingAccess
88   fun:pthread_join
89   fun:pthread_join
90}
91{
92   drd-libpthread-__deallocate_stack
93   drd:ConflictingAccess
94   ...
95   fun:__deallocate_stack
96}
97{
98   drd-libpthread-__free_stacks
99   drd:ConflictingAccess
100   fun:__free_stacks
101}
102{
103   drd-libpthread-__free_tcb
104   drd:ConflictingAccess
105   ...
106   fun:__free_tcb
107}
108{
109   drd-libpthread-__nptl_deallocate_tsd
110   drd:ConflictingAccess
111   fun:__nptl_deallocate_tsd
112}
113{
114   drd-libpthread-pthread_detach
115   drd:ConflictingAccess
116   fun:pthread_detach
117   fun:pthread_detach
118}
119{
120   drd-libpthread-pthread_once
121   drd:ConflictingAccess
122   fun:pthread_once
123}
124{
125   drd-libpthread-pthread_cancel_init
126   drd:ConflictingAccess
127   fun:pthread_cancel_init
128}
129{
130   drd-libpthread-pthread_cancel
131   drd:ConflictingAccess
132   fun:pthread_cancel
133   fun:pthread_cancel_intercept
134}
135{
136   drd-libpthread-_Unwind_ForcedUnwind
137   drd:ConflictingAccess
138   ...
139   fun:_Unwind_ForcedUnwind
140}
141{
142   drd-libpthread-_Unwind_GetCFA
143   drd:ConflictingAccess
144   fun:_Unwind_GetCFA
145}
146{
147   drd-libpthread-_Unwind_Resume
148   drd:ConflictingAccess
149   ...
150   fun:_Unwind_Resume
151}
152{
153   drd-libpthread-?
154   drd:ConflictingAccess
155   obj:*/lib/libgcc_s.so.1
156}
157{
158   drd-libpthread-nanosleep
159   drd:ConflictingAccess
160   fun:nanosleep
161}
162
163#
164# Suppression patterns for libgomp.
165#
166
167# Unfortunately many statements in libgomp trigger conflicting accesses. It is
168# not clear to me which of these are safe and which ones not. See also
169# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40362
170{
171   drd-libgomp
172   drd:ConflictingAccess
173   obj:/usr/lib*/libgomp.so*
174}
175
176#
177# Suppression patterns for libX11.
178#
179
180{
181   drd-libX11-XCreateFontSet
182   drd:CondErr
183   fun:pthread_cond_init*
184   fun:_XReply
185   fun:XListFontsWithInfo
186   obj:/usr/lib*/libX11.so*
187   fun:XCreateOC
188   fun:XCreateFontSet
189}
190
191#
192# Suppression patterns for libxcb.
193#
194
195{
196   drd-libxcb-xcb_wait_for_reply
197   drd:CondErr
198   ...
199   fun:pthread_cond_destroy*
200   fun:xcb_wait_for_reply
201}
202
203#
204# Suppression patterns for libglib.
205#
206
207{
208   drd-libglib-access-g_threads_got_initialized
209   drd:ConflictingAccess
210   ...
211   fun:g_slice_alloc
212   fun:g_ptr_array_sized_new
213}
214{
215   drd-libglib-access-g_threads_got_initialized
216   drd:ConflictingAccess
217   ...
218   fun:_ZN27QEventDispatcherGlibPrivateC1EP13_GMainContext
219   fun:_ZN20QEventDispatcherGlibC1EP7QObject
220   obj:/usr/lib*/libQtCore.so.4.*
221   obj:/usr/lib*/libQtCore.so.4.*
222}
223{
224   drd-libglib-access-g_mem_initialized
225   drd:ConflictingAccess
226   fun:g_malloc0
227}
228{
229   drd-libglib-g_private_get_posix_impl
230   drd:ConflictingAccess
231   fun:g_private_get_posix_impl
232}
233{
234   drd-libglib-g_private_set_posix_impl
235   drd:ConflictingAccess
236   fun:g_private_set_posix_impl
237}
238{
239   drd-libglib-g_get_language_names
240   drd:ConflictingAccess
241   fun:g_slice_free_chain_with_offset
242}
243{
244   drd-libglib-g_main_context_new
245   drd:ConflictingAccess
246   fun:fcntl
247   obj:/usr/lib*/libglib-*.so*
248   fun:g_main_context_new
249}
250
251#
252# Suppression patterns for libQtCore.
253#
254
255{
256   drd-libQtCore-deref-that-calls-QThreadData-destructor
257   drd:ConflictingAccess
258   fun:_ZN11QThreadDataD1Ev
259   obj:/usr/lib*/libQtCore.so.4.*
260}
261{
262   drd-libQtCore-4.0/4.1-Q_GLOBAL_STATIC-connectionList
263   drd:ConflictingAccess
264   obj:/usr/lib*/libQtCore.so.4.*
265   fun:_ZN11QMetaObject8activateEP7QObjectiiPPv
266   fun:_ZN11QMetaObject8activateEP7QObjectPKS_iPPv
267}
268{
269   drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
270   drd:ConflictingAccess
271   fun:_ZN14QReadWriteLock12lockForWriteEv
272   fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
273   fun:_ZN7QObjectD2Ev
274}
275{
276   drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
277   drd:ConflictingAccess
278   fun:_ZN14QReadWriteLock12lockForWriteEv
279   fun:_ZN12QWriteLocker6relockEv
280   fun:_ZN12QWriteLockerC1EP14QReadWriteLock
281   fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
282   fun:_ZN7QObjectD2Ev
283   fun:_ZN24QAbstractEventDispatcherD2Ev
284   fun:_ZN20QEventDispatcherGlibD0Ev
285}
286{
287   drd-libQtCore-QMutexPool::get(void const*)
288   drd:ConflictingAccess
289   fun:_ZN10QMutexPool3getEPKv
290}
291{
292   drd-libQtCore-qt_gettime_is_monotonic()
293   drd:ConflictingAccess
294   fun:_Z23qt_gettime_is_monotonicv
295}
296
297#
298# Suppression patterns for libboost.
299#
300
301# Suppress the races on boost::once_flag::epoch and on
302# boost::detail::this_thread_epoch. See also the source file
303# boost/thread/pthread/once.hpp in the Boost source tree
304# (https://svn.boost.org/trac/boost/browser/trunk/boost/thread/pthread/once.hpp).
305{
306   drd-libboost-boost::call_once<void (*)()>(boost::once_flag&, void (*)())
307   drd:ConflictingAccess
308   ...
309   fun:_ZN5boost9call_onceIPFvvEEEvRNS_9once_flagET_
310}
311{
312   drd-libboost-boost::detail::get_once_per_thread_epoch()
313   drd:ConflictingAccess
314   fun:_ZN5boost6detail25get_once_per_thread_epochEv
315}
316# Suppress the race reports on boost::detail::current_thread_tls_key. See also
317# https://svn.boost.org/trac/boost/ticket/3526 for more information about why
318# the access pattern of current_thread_tls_key is safe.
319{
320   drd-libboost-boost::detail::get_current_thread_data()
321   drd:ConflictingAccess
322   ...
323   fun:_ZN5boost6detail23get_current_thread_dataEv
324}
325{
326   drd-libboost-boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
327   drd:ConflictingAccess
328   ...
329   fun:_ZN5boost6detail23set_current_thread_dataEPNS0_16thread_data_baseE
330}
331