Configure with thread sanitizer fails the thread test

From: Ewan Higgs <ewan_higgs(at)yahoo(dot)co(dot)uk>
To: <pgsql-hackers(at)postgresql(dot)org>
Subject: Configure with thread sanitizer fails the thread test
Date: 2015-08-17 07:37:45
Message-ID: 1513971675.5870501.1439797066345.JavaMail.yahoo@mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi all,I throught I would try sqlsmith with more sanitizers. So, I tried the ThreadSanitizer. Building off HEAD (522400a5198f63823406202e18fdaf3621619d98), it fails to complete the thread check since the thread test because there are some volatile ints being accessed between threads[1]. Volatile prevents caching of the variable in each thread context but it doesn't provide all the guarantees needed for multithreaded programming. This should probably use _Atomic (C11) on platforms with C11 compilers and whatever else is needed for platforms that refuse to update their compilers past C89.

So I changed volatile to _Atomic and continued (patch is in thread_test_atomic.patch). I then ran it against sqlsmith. The good news: I didn't happen to find any problems in normal use. The bad news: I did find a lot of warnings about improper use of functions like malloc and free from signal handlers. I attached the log under 'errors.log'.
I haven't investigated this in depth yet since I figured if I flagged it on the list someone might be in a better position to determine if it's worth fixing and what the fix might be.
My configure flags:./configure CFLAGS='-O1 -g -fsanitize=thread -fno-omit-frame-pointer -fno-optimize-sibling-calls' LDFLAGS='-ltsan -ldl' --enable-cassert --prefix=$HOME/pkg

Yours,Ewan

[1] Failed test in configure yields:
==================                                                             
WARNING: ThreadSanitizer: data race (pid=31420)                                
  Write of size 4 at 0x000000602100 by thread T2:                              
    #0 func_call_2 src/test/thread/thread_test.c:416 (conftest+0x000000400db9) 
    #1 <null> <null> (libtsan.so.0+0x0000000235b9)                             
                                                                               
  Previous read of size 4 at 0x000000602100 by thread T1:                      
    #0 func_call_1 src/test/thread/thread_test.c:326 (conftest+0x000000400f3a) 
    #1 <null> <null> (libtsan.so.0+0x0000000235b9)                             
                                                                               
  Location is global 'errno2_set' of size 4 at 0x000000602100 (conftest+0x000000602100)
                                                                               
  Thread T2 (tid=31423, running) created by main thread at:                    
    #0 pthread_create <null> (libtsan.so.0+0x000000027a67)                     
    #1 main src/test/thread/thread_test.c:165 (conftest+0x0000004010e1)        
                                                                               
  Thread T1 (tid=31422, running) created by main thread at:                    
    #0 pthread_create <null> (libtsan.so.0+0x000000027a67)                     
    #1 main src/test/thread/thread_test.c:158 (conftest+0x00000040107e)        
                                                                               
SUMMARY: ThreadSanitizer: data race src/test/thread/thread_test.c:416 func_call_2
==================                                                             
WARNING: ThreadSanitizer: data race (pid=31420)                                
  Read of size 4 at 0x000000602104 by thread T2:                               
    #0 func_call_2 src/test/thread/thread_test.c:417 (conftest+0x000000400dcd) 
    #1 <null> <null> (libtsan.so.0+0x0000000235b9)                             
                                                                               
  Previous write of size 4 at 0x000000602104 by thread T1:                     
    #0 func_call_1 src/test/thread/thread_test.c:325 (conftest+0x000000400f26) 
    #1 <null> <null> (libtsan.so.0+0x0000000235b9)                             
                                                                               
  Location is global 'errno1_set' of size 4 at 0x000000602104 (conftest+0x000000602104)
                                                                               
  Thread T2 (tid=31423, running) created by main thread at:                    
    #0 pthread_create <null> (libtsan.so.0+0x000000027a67)                     
    #1 main src/test/thread/thread_test.c:165 (conftest+0x0000004010e1)        
                                                                               
  Thread T1 (tid=31422, running) created by main thread at:                    
    #0 pthread_create <null> (libtsan.so.0+0x000000027a67)                     
    #1 main src/test/thread/thread_test.c:158 (conftest+0x00000040107e)        
                                                                               
SUMMARY: ThreadSanitizer: data race src/test/thread/thread_test.c:417 func_call_2
==================                                                             
errno not thread-safe **                                                       
exiting                                                                        
==================                                                             
WARNING: ThreadSanitizer: data race (pid=31420)                                
  Write of size 4 at 0x00000060210c by thread T1:                              
    #0 func_call_1 src/test/thread/thread_test.c:381 (conftest+0x000000400fc8) 
    #1 <null> <null> (libtsan.so.0+0x0000000235b9)                             
                                                                               
  Previous read of size 4 at 0x00000060210c by main thread (mutexes: write M6):
    #0 main src/test/thread/thread_test.c:176 (conftest+0x000000401123)        
                                                                               
  Location is global 'thread1_done' of size 4 at 0x00000060210c (conftest+0x00000060210c)
                                                                               
  Mutex M6 (0x000000602120) created at:                                        
    #0 pthread_mutex_lock <null> (libtsan.so.0+0x000000037776)                 
    #1 main src/test/thread/thread_test.c:156 (conftest+0x000000401066)        
                                                                               
  Thread T1 (tid=31422, running) created by main thread at:                    
    #0 pthread_create <null> (libtsan.so.0+0x000000027a67)                     
    #1 main src/test/thread/thread_test.c:158 (conftest+0x00000040107e)        
                                                                               
SUMMARY: ThreadSanitizer: data race src/test/thread/thread_test.c:381 func_call_1
==================                                                             
ThreadSanitizer: reported 3 warnings 

Attachment Content-Type Size
errors.log text/plain 1.1 MB
thread_test_atomic.patch text/x-patch 821 bytes

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Albe Laurenz 2015-08-17 07:44:40 Re: Autonomous Transaction is back
Previous Message Heikki Linnakangas 2015-08-17 07:16:43 Re: pgbench bug in head