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 # 29 # Suppression patterns for libstdc++, the implementation of the standard C++ 30 # library included with the gcc compiler. 31 # 32 # Note: several versions of the libstdc++ library (4.2.2, 4.3.2, 4.4.0, 4.5.0 33 # and their predecessors) contain an implementation of the std::string class 34 # that triggers conflicting memory accesses. See also 35 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40518 36 # 37 38 # { 39 # drd-libstdc++-std::string::string() 40 # drd:ConflictingAccess 41 # fun:_ZNSsC1ERKSs 42 # } 43 44 { 45 drd-libstdc++-cxa_guard_release 46 drd:CondErr 47 fun:pthread_cond_broadcast@* 48 fun:__cxa_guard_release 49 } 50 51 52 # 53 # Suppression patterns for libpthread. 54 # 55 56 { 57 drd-libpthread-pthread_create 58 drd:ConflictingAccess 59 ... 60 fun:pthread_create* 61 } 62 { 63 drd-libpthread-pthread_join 64 drd:ConflictingAccess 65 fun:pthread_join 66 fun:pthread_join 67 } 68 { 69 drd-libpthread-__deallocate_stack 70 drd:ConflictingAccess 71 ... 72 fun:__deallocate_stack 73 } 74 { 75 drd-libpthread-__free_stacks 76 drd:ConflictingAccess 77 fun:__free_stacks 78 } 79 { 80 drd-libpthread-__free_tcb 81 drd:ConflictingAccess 82 ... 83 fun:__free_tcb 84 } 85 { 86 drd-libpthread-__nptl_deallocate_tsd 87 drd:ConflictingAccess 88 fun:__nptl_deallocate_tsd 89 } 90 { 91 drd-libpthread-pthread_detach 92 drd:ConflictingAccess 93 fun:pthread_detach 94 fun:pthread_detach 95 } 96 { 97 drd-libpthread-pthread_once 98 drd:ConflictingAccess 99 fun:pthread_once 100 } 101 { 102 drd-libpthread-pthread_cancel_init 103 drd:ConflictingAccess 104 fun:pthread_cancel_init 105 } 106 { 107 drd-libpthread-_Unwind_ForcedUnwind 108 drd:ConflictingAccess 109 ... 110 fun:_Unwind_ForcedUnwind 111 } 112 { 113 drd-libpthread-_Unwind_GetCFA 114 drd:ConflictingAccess 115 fun:_Unwind_GetCFA 116 } 117 { 118 drd-libpthread-_Unwind_Resume 119 drd:ConflictingAccess 120 ... 121 fun:_Unwind_Resume 122 } 123 { 124 drd-libpthread-? 125 drd:ConflictingAccess 126 obj:/lib/libgcc_s.so.1 127 } 128 { 129 drd-libpthread-nanosleep 130 drd:ConflictingAccess 131 fun:nanosleep 132 } 133 134 # 135 # Suppression patterns for libgomp. 136 # 137 138 # Unfortunately many statements in libgomp trigger conflicting accesses. It is 139 # not clear to me which of these are safe and which ones not. See also 140 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40362 141 { 142 drd-libgomp 143 drd:ConflictingAccess 144 obj:/usr/lib*/libgomp.so* 145 } 146 147 # 148 # Suppression patterns for libX11. 149 # 150 151 { 152 drd-libX11-XCreateFontSet 153 drd:CondErr 154 fun:pthread_cond_init* 155 fun:_XReply 156 fun:XListFontsWithInfo 157 obj:/usr/lib*/libX11.so* 158 fun:XCreateOC 159 fun:XCreateFontSet 160 } 161 162 # 163 # Suppression patterns for libxcb. 164 # 165 166 { 167 drd-libxcb-xcb_wait_for_reply 168 drd:CondErr 169 fun:pthread_cond_destroy* 170 fun:xcb_wait_for_reply 171 } 172 173 # 174 # Suppression patterns for libglib. 175 # 176 177 { 178 drd-libglib-access-g_threads_got_initialized 179 drd:ConflictingAccess 180 ... 181 fun:g_slice_alloc 182 fun:g_ptr_array_sized_new 183 } 184 { 185 drd-libglib-access-g_threads_got_initialized 186 drd:ConflictingAccess 187 ... 188 fun:_ZN27QEventDispatcherGlibPrivateC1EP13_GMainContext 189 fun:_ZN20QEventDispatcherGlibC1EP7QObject 190 obj:/usr/lib*/libQtCore.so.4.* 191 obj:/usr/lib*/libQtCore.so.4.* 192 } 193 { 194 drd-libglib-access-g_mem_initialized 195 drd:ConflictingAccess 196 fun:g_malloc0 197 } 198 { 199 drd-libglib-g_private_get_posix_impl 200 drd:ConflictingAccess 201 fun:g_private_get_posix_impl 202 } 203 { 204 drd-libglib-g_private_set_posix_impl 205 drd:ConflictingAccess 206 fun:g_private_set_posix_impl 207 } 208 { 209 drd-libglib-g_get_language_names 210 drd:ConflictingAccess 211 fun:g_slice_free_chain_with_offset 212 } 213 { 214 drd-libglib-g_main_context_new 215 drd:ConflictingAccess 216 fun:fcntl 217 obj:/usr/lib*/libglib-*.so* 218 fun:g_main_context_new 219 } 220 221 # 222 # Suppression patterns for libQtCore. 223 # 224 225 { 226 drd-libQtCore-deref-that-calls-QThreadData-destructor 227 drd:ConflictingAccess 228 fun:_ZN11QThreadDataD1Ev 229 obj:/usr/lib*/libQtCore.so.4.* 230 } 231 { 232 drd-libQtCore-4.0/4.1-Q_GLOBAL_STATIC-connectionList 233 drd:ConflictingAccess 234 obj:/usr/lib*/libQtCore.so.4.* 235 fun:_ZN11QMetaObject8activateEP7QObjectiiPPv 236 fun:_ZN11QMetaObject8activateEP7QObjectPKS_iPPv 237 } 238 { 239 drd-libQtCore-QObjectPrivate::clearGuards(QObject*) 240 drd:ConflictingAccess 241 fun:_ZN14QReadWriteLock12lockForWriteEv 242 fun:_ZN14QObjectPrivate11clearGuardsEP7QObject 243 fun:_ZN7QObjectD2Ev 244 } 245 { 246 drd-libQtCore-QObjectPrivate::clearGuards(QObject*) 247 drd:ConflictingAccess 248 fun:_ZN14QReadWriteLock12lockForWriteEv 249 fun:_ZN12QWriteLocker6relockEv 250 fun:_ZN12QWriteLockerC1EP14QReadWriteLock 251 fun:_ZN14QObjectPrivate11clearGuardsEP7QObject 252 fun:_ZN7QObjectD2Ev 253 fun:_ZN24QAbstractEventDispatcherD2Ev 254 fun:_ZN20QEventDispatcherGlibD0Ev 255 } 256 { 257 drd-libQtCore-QMutexPool::get(void const*) 258 drd:ConflictingAccess 259 fun:_ZN10QMutexPool3getEPKv 260 } 261 { 262 drd-libQtCore-qt_gettime_is_monotonic() 263 drd:ConflictingAccess 264 fun:_Z23qt_gettime_is_monotonicv 265 } 266 267 # 268 # Suppression patterns for libboost. 269 # 270 271 # Suppress the races on boost::once_flag::epoch and on 272 # boost::detail::this_thread_epoch. See also the source file 273 # boost/thread/pthread/once.hpp in the Boost source tree 274 # (https://svn.boost.org/trac/boost/browser/trunk/boost/thread/pthread/once.hpp). 275 { 276 drd-libboost-boost::call_once<void (*)()>(boost::once_flag&, void (*)()) 277 drd:ConflictingAccess 278 ... 279 fun:_ZN5boost9call_onceIPFvvEEEvRNS_9once_flagET_ 280 } 281 { 282 drd-libboost-boost::detail::get_once_per_thread_epoch() 283 drd:ConflictingAccess 284 fun:_ZN5boost6detail25get_once_per_thread_epochEv 285 } 286 # Suppress the race reports on boost::detail::current_thread_tls_key. See also 287 # https://svn.boost.org/trac/boost/ticket/3526 for more information about why 288 # the access pattern of current_thread_tls_key is safe. 289 { 290 drd-libboost-boost::detail::get_current_thread_data() 291 drd:ConflictingAccess 292 ... 293 fun:_ZN5boost6detail23get_current_thread_dataEv 294 } 295 { 296 drd-libboost-boost::detail::set_current_thread_data(boost::detail::thread_data_base*) 297 drd:ConflictingAccess 298 ... 299 fun:_ZN5boost6detail23set_current_thread_dataEPNS0_16thread_data_baseE 300 } 301