google / sanitizers

AddressSanitizer, ThreadSanitizer, MemorySanitizer
Other
11.46k stars 1.03k forks source link

ThreadSanitizer with GCC 4.9.0 - TSAN_OPTIONS ignored #502

Closed ramosian-glider closed 9 years ago

ramosian-glider commented 9 years ago

Originally reported on Google Code with ID 95

I am using ThreadSanitizer on a 'C' program compiled with GCC 4.9.0 running under Ubuntu
2.04.

ThreadSanitizer itself is working properly, but it is ignoring the TSAN_OPTIONS environment
variable.

This issue occurs whether I am running the program from within GDB 7.4. or directly
from the command line.

I have set the environment variable from the command line before running GDB as follows:

export TSAN_OPTIONS=report_bugs=0

I have confirmed that TSAN_OPTIONS is set as expected, both from "printenv" on the
command line and also from within the "C" program under test, using getenv().

For example the above setting, which should stop bugs from being reported by ThreadSanitizer,
fails to stop bugs being reported by ThreadSanitizer.

Some other switches I have tested are suppressions and log_path.

TSAN Compile switches are -fsanitize=thread -fno-omit-frame-pointer -fPIE

TSAN Link switches -fsanitize=thread -fno-omit-frame-pointer -pie

Any help or ideas are appreciated.

Reported by gblaneyToronto on 2015-08-18 09:57:10

ramosian-glider commented 9 years ago
 I have noticed that TSAN_OPTIONS is written as TSAN_OPTIONS=report_bugs=0 ./a.out with
an addition "./a.out" at the end. An explanation on this is appreciated. There is really
no place where the TSAN_OPTIONS syntax is fully explained. Also as an additional clue
I am seeing the same issue of options being ignored recognizing with ASAN_OPTIONS.
–  GCB Toronto 17 hours ago  

The additional parameter is likely the name of the process for which the options will
be applied. I have tried adding this, but the result is the same: options specified
by TSAN_OPTIONS are ignored by ThreadSanitizer. 

Reported by gblaneyToronto on 2015-08-18 09:58:13

ramosian-glider commented 9 years ago
Hi,

Yes, the additional parameter is executable name. When you invoke:

$ ENVVAR=somevalue ./executable

this runs the ./executable with ENVVAR=somevalue in environment.

I've just tested this with gcc4.8 and gcc6.0. I don't have gcc4.9. Please provide full
reproduction instructions (sequence of commands you execute) and source code.

Reported by dvyukov@google.com on 2015-08-18 10:09:24

ramosian-glider commented 9 years ago
Hi, thanks for the reply. I am going to try GCC 4.8. Also my project is quite large
so I am assembling some example source code for this and I will reply with this shortly.

My execution procedure is as follows:

$ export TSAN_OPTIONS=report_bugs=0
$ printenv TSAN_OPTIONS
$ report_bugs=0
$ ./MY_EXECUTABLE.BIN
$ <various TSAN errors are reported>

I also tried:

$ TSAN_OPTIONS=report_bugs=0 ./MY_EXECUTABLE.BIN
$ <various TSAN errors are reported>

Reported by gblaneyToronto on 2015-08-18 16:19:17

ramosian-glider commented 9 years ago
Note: the line above under printenv TSAN_OPTIONS ("report_bugs=0") is the output of
printenv.

Reported by gblaneyToronto on 2015-08-18 16:25:16

ramosian-glider commented 9 years ago
Please build and run the following program:

#include <pthread.h>

int x;

void *thread(void *a) {
  x = 42;
  return 0;
}

int main() {
  pthread_t t;
  pthread_create(&t, 0, thread, 0);
  x = 43;
  pthread_join(t, 0);
}

Using the following commands:

$ gcc test.c -fsanitize=thread -pie -fPIE -ltsan -lpthread -lrt -ldl
$ ./a.out
$ TSAN_OPTIONS=report_bugs=0 ./a.out

What does it output?

Reported by dvyukov@google.com on 2015-08-18 16:35:09

ramosian-glider commented 9 years ago
That does work! And once I copy and paste your options into my own little demo program,
that I was about to send you, it worked too. That is, I am now able to control the
output of ThreadSanitize.

The output of a.out is at the bottom of this post.

This is the abbreviated compiler and linker command lines of my original project. Is
the issue with my command line obvious from a quick look?

gcc -save-temps -gdwarf-3 I../src/LIB/Include -O0 -fstack-protector-all -g -Werror
-c -fmessage-length=0 -fsanitize=thread -fno-omit-frame-pointer -fPIE -fPIC -MMD -MP
-MF"src/LIB/cmpltime.d" -MT"src/LIB/cmpltime.d" -o"src/LIB/cmpltime.o" "../src/LIB/cmpltime.c"

gcc -o "TSI40V1"      -lpthread -lrt -fsanitize=thread -fno-omit-frame-pointer -pie

Thanks for you assistance.

============

output of a.out:

==================
WARNING: ThreadSanitizer: data race (pid=29165)
  Write of size 4 at 0x7f2e51e6a2ec by thread T1:
    #0 thread /root/tsan_demo 2/tsan-demo/src/tsan-demo.c:6 (a.out+0x000000000b27)
    #1 <null> <null> (libtsan.so.0+0x000000026629)

  Previous write of size 4 at 0x7f2e51e6a2ec by main thread:
    #0 main /root/tsan_demo 2/tsan-demo/src/tsan-demo.c:13 (a.out+0x000000000b89)

  Location is global 'x' of size 4 at 0x7f2e51e6a2ec (a.out+0x0000002012ec)

  Thread T1 (tid=29167, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x00000002a4f7)
    #1 main /root/tsan_demo 2/tsan-demo/src/tsan-demo.c:12 (a.out+0x000000000b7a)

SUMMARY: ThreadSanitizer: data race /root/tsan_demo 2/tsan-demo/src/tsan-demo.c:6 thread
==================
ThreadSanitizer: reported 1 warnings

Reported by gblaneyToronto on 2015-08-18 20:19:32

ramosian-glider commented 9 years ago
I am surprised that your commands work for you. The first command misses "-" before
"I../src/LIB/Include". The second command missed name of object file. Are you sure
that are exact commands that you run?
Also I don't think "-fno-omit-frame-pointer" affects linking in any way.  Also, "-fPIE
-fPIC" looks strange, one of these options takes precedence.

I've just checked the following commands:
$ gcc -save-temps -gdwarf-3 I../src/LIB/Include -O0 -fstack-protector-all -g -Werror
-c -fmessage-length=0 -fsanitize=thread -fno-omit-frame-pointer -fPIE -fPIC /tmp/111.c
$ gcc 111.o -o "TSI40V1" -lpthread -lrt -ltsan -fno-omit-frame-pointer -pie

And they worked for me (successful build and TSAN_OPTIONS works).

Reported by dvyukov@google.com on 2015-08-18 20:30:40

ramosian-glider commented 9 years ago
I tweak the original project compiler and linker command lines as follows based on you
recommendation (this is an Eclipse project):

gcc -fsanitize=thread -pie -fPIE -ltsan -lpthread -lrt -ldl -I../src/LIB/Include -O0
-fstack-protector-all -g -Werror -c -fmessage-length=0 -MMD -MP -MF"src/version.d"
-MT"src/version.d" -o"src/version.o" "../src/version.c"

gcc  -fsanitize=thread -pie -fPIE -ltsan -lpthread -lrt -ldl -o "TSI40V1"  ./src/LIB/comm/zmodem/copy_lfs.o

Reported by gblaneyToronto on 2015-08-18 20:48:00

ramosian-glider commented 9 years ago
(The above tweak does not work) It is quite a large project. I am not sure if that is
a factor.

Reported by gblaneyToronto on 2015-08-18 20:51:04

ramosian-glider commented 9 years ago
I abbreviated the actual commands since they are quite large with a lot of -D arguments
and a lot of object files. I may have delete an object file entry.

Reported by gblaneyToronto on 2015-08-18 20:54:38

ramosian-glider commented 9 years ago
Is it possible that your original large program starts other subprocesses and does not
pass environment to them? Maybe the race reports are printed from subprocesses?

What if you run your program with TSAN_OPTIONS=verbosity=100 environment var? Do you
see any additional output from tsan? If yes, then TSAN_OPTIONS work for this program.

Reported by dvyukov@google.com on 2015-08-18 21:09:26

ramosian-glider commented 9 years ago
With "verbosity=100" I am seeing 

checking shadow region 0x000000001000-0x010000000000
  checking pointer 0x000000001000 -> 0x080000004000
  checking pointer 0x000000001001 -> 0x080000004000
  checking pointer 0x004000000bff -> 0x090000002fe0

that I do not see with "verbosity=1" or with "report_bugs=0".

I think the verbosity is making a difference and yet "report_bugs=0" does not turn
off the bug reporting

Some samples are below. There is a lot of output and my copy and paste cutoff in each
case is arbitrary.

//////////////////////////////////////////////
verbosity=100
//////////////////////////////////////////////
checking shadow region 0x000000001000-0x010000000000
  checking pointer 0x000000001000 -> 0x080000004000
  checking pointer 0x000000001001 -> 0x080000004000
  checking pointer 0x004000000bff -> 0x090000002fe0
  checking pointer 0x004000000c00 -> 0x090000003000
  checking pointer 0x004000000c01 -> 0x090000003000
  checking pointer 0x0080000007ff -> 0x0a0000001fe0
  checking pointer 0x008000000800 -> 0x0a0000002000
  checking pointer 0x008000000801 -> 0x0a0000002000
  checking pointer 0x00c0000003ff -> 0x0b0000000fe0
  checking pointer 0x00c000000400 -> 0x0b0000001000
  checking pointer 0x00c000000401 -> 0x0b0000001000
  checking pointer 0x00ffffffffff -> 0x0bffffffffe0
checking shadow region 0x7e8000000000-0x800000000000
  checking pointer 0x7e8000000000 -> 0x020000000000
  checking pointer 0x7e8000000001 -> 0x020000000000
  checking pointer 0x7edfffffffff -> 0x037fffffffe0
  checking pointer 0x7ee000000000 -> 0x038000000000
  checking pointer 0x7ee000000001 -> 0x038000000000
  checking pointer 0x7f3fffffffff -> 0x04ffffffffe0
  checking pointer 0x7f4000000000 -> 0x050000000000
  checking pointer 0x7f4000000001 -> 0x050000000000
  checking pointer 0x7f9fffffffff -> 0x067fffffffe0
  checking pointer 0x7fa000000000 -> 0x068000000000
  checking pointer 0x7fa000000001 -> 0x068000000000
  checking pointer 0x7fffffffffff -> 0x07ffffffffe0
checking shadow region 0x7d0000000000-0x7e0000000000
  checking pointer 0x7d0000000000 -> 0x0c0000000000
  checking pointer 0x7d0000000001 -> 0x0c0000000000
  checking pointer 0x7d3fffffffff -> 0x0cffffffffe0
  checking pointer 0x7d4000000000 -> 0x0d0000000000
  checking pointer 0x7d4000000001 -> 0x0d0000000000
  checking pointer 0x7d7fffffffff -> 0x0dffffffffe0
  checking pointer 0x7d8000000000 -> 0x0e0000000000
  checking pointer 0x7d8000000001 -> 0x0e0000000000
  checking pointer 0x7dbfffffffff -> 0x0effffffffe0
  checking pointer 0x7dc000000000 -> 0x0f0000000000
  checking pointer 0x7dc000000001 -> 0x0f0000000000
  checking pointer 0x7dffffffffff -> 0x0fffffffffe0
***** Running under ThreadSanitizer v2 (pid 1906) *****
INFO: ThreadSanitizer ignores mlock/mlockall/munlock/munlockall

TSIARG file found

cfg transfer enable state 0 

269 001 SOFTWARE: FtpStartServer-417 Undefined function executed
FTP server startup failed
Sanitizer: increasing stacksize 20480->565824
==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=1906)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 gblnet_wait_start ../src/LIB/comm/tcpip/gblnet6.c:4783 (TSI40V1+0x00000014dd53)
    #3 gblnet_startup_event ../src/LIB/comm/tcpip/gblnet6.c:4896 (TSI40V1+0x00000014e3c9)
    #4 gblnet_wait_init ../src/LIB/comm/tcpip/gblnet6.c:4765 (TSI40V1+0x00000014dc58)
    #5 gblnet_init ../src/LIB/comm/tcpip/gblnet6.c:598 (TSI40V1+0x00000013b474)
    #6 main ../src/LIB/Core/main.c:376 (TSI40V1+0x00000088dfcf)

  Location is global 'tsi_handle' of size 14942208 at 0x7f798735c900 (TSI40V1+0x00000331c890)

  Mutex M2139 (0x7f79874d7890) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 gblnet_wait_init ../src/LIB/comm/tcpip/gblnet6.c:4761 (TSI40V1+0x00000014dc16)
    #3 gblnet_init ../src/LIB/comm/tcpip/gblnet6.c:598 (TSI40V1+0x00000013b474)
    #4 main ../src/LIB/Core/main.c:376 (TSI40V1+0x00000088dfcf)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock
==================

953 001 WARNING: tsinet13.c-7588 Null TCP handle==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=1906)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 cfg_setup_wait_start ../src/LIB/Core/cfg_save.c:707 (TSI40V1+0x00000084b98e)
    #3 cfgbuf_init ../src/LIB/Core/cfgbuf.c:127 (TSI40V1+0x00000086da62)
    #4 main ../src/LIB/Core/main.c:406 (TSI40V1+0x00000088e0a3)

  Location is global 'tsi_handle' of size 14942208 at 0x7f798735c900 (TSI40V1+0x000003331770)

  Mutex M2212 (0x7f79874ec770) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 cfg_init ../src/LIB/Core/cfg_save.c:659 (TSI40V1+0x00000084b69e)
    #3 main ../src/LIB/Core/main.c:389 (TSI40V1+0x00000088e00e)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock
==================
==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=1906)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 gpiport_setup_wait_start ../src/LIB/GPI/gpiport2.c:3052 (TSI40V1+0x00000074c298)
    #3 cfgbuf_init ../src/LIB/Core/cfgbuf.c:129 (TSI40V1+0x00000086da67)
    #4 main ../src/LIB/Core/main.c:406 (TSI40V1+0x00000088e0a3)

  Location is global 'tsi_handle' of size 14942208 at 0x7f798735c900 (TSI40V1+0x0000033b5d58)

  Mutex M3401 (0x7f7987570d58) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 gpiport_wait_init ../src/LIB/GPI/gpiport2.c:3033 (TSI40V1+0x00000074c0d6)
    #3 gpiport_init ../src/LIB/GPI/gpiport2.c:251 (TSI40V1+0x000000740966)
    #4 main ../src/LIB/Core/main.c:403 (TSI40V1+0x00000088e078)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock

//////////////////////////////////////////////
verbosity=1
//////////////////////////////////////////////

***** Running under ThreadSanitizer v2 (pid 1886) *****
INFO: ThreadSanitizer ignores mlock/mlockall/munlock/munlockall

TSIARG file found

cfg transfer enable state 0 

270 001 SOFTWARE: FtpStartServer-417 Undefined function executed
FTP server startup failed
Sanitizer: increasing stacksize 20480->565824
==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=1886)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 gblnet_wait_start ../src/LIB/comm/tcpip/gblnet6.c:4783 (TSI40V1+0x00000014dd53)
    #3 gblnet_startup_event ../src/LIB/comm/tcpip/gblnet6.c:4896 (TSI40V1+0x00000014e3c9)
    #4 gblnet_wait_init ../src/LIB/comm/tcpip/gblnet6.c:4765 (TSI40V1+0x00000014dc58)
    #5 gblnet_init ../src/LIB/comm/tcpip/gblnet6.c:598 (TSI40V1+0x00000013b474)
    #6 main ../src/LIB/Core/main.c:376 (TSI40V1+0x00000088dfcf)

  Location is global 'tsi_handle' of size 14942208 at 0x7ff573c4b900 (TSI40V1+0x00000331c890)

  Mutex M2139 (0x7ff573dc6890) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 gblnet_wait_init ../src/LIB/comm/tcpip/gblnet6.c:4761 (TSI40V1+0x00000014dc16)
    #3 gblnet_init ../src/LIB/comm/tcpip/gblnet6.c:598 (TSI40V1+0x00000013b474)
    #4 main ../src/LIB/Core/main.c:376 (TSI40V1+0x00000088dfcf)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock
==================

797 001 WARNING: tsinet13.c-7588 Null TCP handle==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=1886)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 cfg_setup_wait_start ../src/LIB/Core/cfg_save.c:707 (TSI40V1+0x00000084b98e)
    #3 cfgbuf_init ../src/LIB/Core/cfgbuf.c:127 (TSI40V1+0x00000086da62)
    #4 main ../src/LIB/Core/main.c:406 (TSI40V1+0x00000088e0a3)

  Location is global 'tsi_handle' of size 14942208 at 0x7ff573c4b900 (TSI40V1+0x000003331770)

  Mutex M2212 (0x7ff573ddb770) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 cfg_init ../src/LIB/Core/cfg_save.c:659 (TSI40V1+0x00000084b69e)
    #3 main ../src/LIB/Core/main.c:389 (TSI40V1+0x00000088e00e)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock
==================
==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=1886)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 gpiport_setup_wait_start ../src/LIB/GPI/gpiport2.c:3052 (TSI40V1+0x00000074c298)
    #3 cfgbuf_init ../src/LIB/Core/cfgbuf.c:129 (TSI40V1+0x00000086da67)
    #4 main ../src/LIB/Core/main.c:406 (TSI40V1+0x00000088e0a3)

  Location is global 'tsi_handle' of size 14942208 at 0x7ff573c4b900 (TSI40V1+0x0000033b5d58)

  Mutex M3401 (0x7ff573e5fd58) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 gpiport_wait_init ../src/LIB/GPI/gpiport2.c:3033 (TSI40V1+0x00000074c0d6)
    #3 gpiport_init ../src/LIB/GPI/gpiport2.c:251 (TSI40V1+0x000000740966)
    #4 main ../src/LIB/Core/main.c:403 (TSI40V1+0x00000088e078)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock
==================
Sanitizer: increasing stacksize 20480->565824

//////////////////////////////////////////////
report_bugs=0
//////////////////////////////////////////////
TSIARG file found

cfg transfer enable state 0 

270 001 SOFTWARE: FtpStartServer-417 Undefined function executed
FTP server startup failed
==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=2163)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 gblnet_wait_start ../src/LIB/comm/tcpip/gblnet6.c:4783 (TSI40V1+0x00000014dd53)
    #3 gblnet_startup_event ../src/LIB/comm/tcpip/gblnet6.c:4896 (TSI40V1+0x00000014e3c9)
    #4 gblnet_wait_init ../src/LIB/comm/tcpip/gblnet6.c:4765 (TSI40V1+0x00000014dc58)
    #5 gblnet_init ../src/LIB/comm/tcpip/gblnet6.c:598 (TSI40V1+0x00000013b474)
    #6 main ../src/LIB/Core/main.c:376 (TSI40V1+0x00000088dfcf)

  Location is global 'tsi_handle' of size 14942208 at 0x7f50e1ee8900 (TSI40V1+0x00000331c890)

  Mutex M2139 (0x7f50e2063890) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 gblnet_wait_init ../src/LIB/comm/tcpip/gblnet6.c:4761 (TSI40V1+0x00000014dc16)
    #3 gblnet_init ../src/LIB/comm/tcpip/gblnet6.c:598 (TSI40V1+0x00000013b474)
    #4 main ../src/LIB/Core/main.c:376 (TSI40V1+0x00000088dfcf)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock
==================

792 001 WARNING: tsinet13.c-7588 Null TCP handle==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=2163)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 cfg_setup_wait_start ../src/LIB/Core/cfg_save.c:707 (TSI40V1+0x00000084b98e)
    #3 cfgbuf_init ../src/LIB/Core/cfgbuf.c:127 (TSI40V1+0x00000086da62)
    #4 main ../src/LIB/Core/main.c:406 (TSI40V1+0x00000088e0a3)

  Location is global 'tsi_handle' of size 14942208 at 0x7f50e1ee8900 (TSI40V1+0x000003331770)

  Mutex M2212 (0x7f50e2078770) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 cfg_init ../src/LIB/Core/cfg_save.c:659 (TSI40V1+0x00000084b69e)
    #3 main ../src/LIB/Core/main.c:389 (TSI40V1+0x00000088e00e)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock
==================
==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=2163)
    #0 pthread_mutex_unlock <null> (libtsan.so.0+0x00000003834b)
    #1 ResetEvent ../src/LIB/comm/win32func2linux.c:963 (TSI40V1+0x000000202fcf)
    #2 gpiport_setup_wait_start ../src/LIB/GPI/gpiport2.c:3052 (TSI40V1+0x00000074c298)
    #3 cfgbuf_init ../src/LIB/Core/cfgbuf.c:129 (TSI40V1+0x00000086da67)
    #4 main ../src/LIB/Core/main.c:406 (TSI40V1+0x00000088e0a3)

  Location is global 'tsi_handle' of size 14942208 at 0x7f50e1ee8900 (TSI40V1+0x0000033b5d58)

  Mutex M3401 (0x7f50e20fcd58) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002af15)
    #1 _CreateEvent ../src/LIB/comm/win32func2linux.c:879 (TSI40V1+0x000000202b3b)
    #2 gpiport_wait_init ../src/LIB/GPI/gpiport2.c:3033 (TSI40V1+0x00000074c0d6)
    #3 gpiport_init ../src/LIB/GPI/gpiport2.c:251 (TSI40V1+0x000000740966)
    #4 main ../src/LIB/Core/main.c:403 (TSI40V1+0x00000088e078)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) ??:0 __interceptor_pthread_mutex_unlock
==================

Reported by gblaneyToronto on 2015-08-18 21:50:34

ramosian-glider commented 9 years ago
The reports come from a different processes. You can see different values of pid in
reports. I bet you don't propagate environment to subprocesses.

Reported by dvyukov@google.com on 2015-08-18 22:16:12

ramosian-glider commented 9 years ago
By a "process", do you mean a thread? The only function used here for creating a new
thread or a process is pthread_create(). I am betting the different pid numbers are
the LWPs for the individual threads in my program.

I called getenv() from one of my threads other than main and it was able to print out
the contents of TSAN_OPTIONS.

Reported by gblaneyToronto on 2015-08-18 23:00:17

ramosian-glider commented 9 years ago
Are there any runtime controls or flags that can be accessed to control ThreadSanitizer
"on the fly"? 

In this way the program under test can be started up normally then ThreadSanitizer
"turned on" to output reports during a controlled interval of time.

Reported by gblaneyToronto on 2015-08-19 12:44:14

ramosian-glider commented 9 years ago
These look like separate processes, not threads.

TSAN_OPTIONS env var works if you see additional output when specify TSAN_OPTIONS=verbosity=100.

I think the issue can be that "unlock of an unlocked mutex" reports are not affected
by report_bugs flags. We used report_bugs solely to benchmark tsan on racy programs,
it was never intended as something users may want to use, there is just no reason to.
You use tsan to get bug reports.
I will double check if "unlock of an unlocked mutex" is suppressed by report_bugs=0
flag.

There is no functionality to turn tsan on/off at runtime. Why do you want to do this?

Reported by dvyukov@google.com on 2015-08-19 13:01:47

ramosian-glider commented 9 years ago
Even though I cannot control ThreadSanitizers output it is providing useful output and
it is fast enough to allow my realtime program to run normally. I am in the meantime
working on why ThreadSanitizer is ignoring commands from TSAN_OPTIONS.

Reported by gblaneyToronto on 2015-08-19 13:29:42

ramosian-glider commented 9 years ago
> I am in the meantime working on why ThreadSanitizer is ignoring commands from TSAN_OPTIONS.

As I said above, it can be the case that tsan just fails to suppress "unlock of an
unlocked mutex" reports, but suppresses all other types of reports.

Reported by dvyukov@google.com on 2015-08-19 13:33:04

ramosian-glider commented 9 years ago
Sorry I missed your comment above. Thanks, if you do find out about the "unlock of an
unlocked mutex" re bug please reports let me know. 

The only reason we were setting "report_bugs=0" was as a simple test of the option
flags. I will experiment some more with message suppression. 

Is there a good document link for the error suppression? I was having some problems
with that as will, which is why I started some other checks of TSAN_OPTIONS.

In the initial stages of testing with TSAN, the reason for perhaps waiting for startup
is simply to allow us to quickly get to issues during regular operation, and not have
to wade through a lot of startup errors (initially). Also it may be useful to turn
on TSAN just under conditions where a fault may be more likely, again cutting down
the number of uninteresting error messages.

Reported by gblaneyToronto on 2015-08-19 15:24:06

ramosian-glider commented 9 years ago
I am trying to use TSAN_OPTIONS="suppressions=/home/11.txt" ./a.out  but  I got the
information "ThreadSanitizer: failed to read suppressions file". There is no permission
problem because I set file readable and writable.

Reported by gracechangjj on 2015-08-19 21:04:12

ramosian-glider commented 9 years ago
PLease run the binary under strace as :

$ strace ./your_binary

and post output here (or at least the last part that contains open of /home/11.txt).

Reported by dvyukov@google.com on 2015-08-19 21:11:54

ramosian-glider commented 9 years ago
munmap(0x7f843ee22000, 16384)           = 0
munmap(0x7f843ee27000, 524288)          = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f843eeaa000
open("/home/11.txt", O_RDONLY)          = 3
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f843eea9000
read(3, "", 4096)                       = 0
close(3)                                = 0
write(2, "ThreadSanitizer: failed to read "..., 65ThreadSanitizer: failed to read suppressions
file '/home/11.txt'
) = 65
exit_group(1)                    

Reported by gracechangjj on 2015-08-19 21:22:34

ramosian-glider commented 9 years ago
It seems your suppressions file is empty (read returns 0). As far as I see current code
should not fail on this, but maybe the code in in the old gcc does. Try to add some
actual suppressions to the file.

Reported by dvyukov@google.com on 2015-08-20 07:17:38

ramosian-glider commented 9 years ago

Reported by glider@google.com on 2015-08-21 14:10:41

ramosian-glider commented 9 years ago
report_bugs=0 is fixed in:
http://llvm.org/viewvc/llvm-project?view=revision&revision=245720

I don't see anything else actionable here, so closing.

Reported by dvyukov@google.com on 2015-08-21 18:25:03