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