ThreadSanitizer: add suppressions
Add a file .tsan-suppressions and list two functions in it: want_color() and transfer_debug(). Both of these use the pattern static int foo = -1; if (foo < 0) foo = bar(); where bar always returns the same non-negative value. This can cause ThreadSanitizer to diagnose a race when foo is written from two threads. That is indeed a race, although it arguably doesn't matter in practice since it's always the same value that is written. Add NEEDSWORK-comments to the functions so that this problem is not forever swept way under the carpet. The suppressions-file is used by setting the environment variable TSAN_OPTIONS to, e.g., "suppressions=$(pwd)/.tsan-suppressions". Observe that relative paths such as ".tsan-suppressions" might not work. Signed-off-by: Martin Ågren <martin.agren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
65961d5a75
commit
6cdf8a7929
10
.tsan-suppressions
Normal file
10
.tsan-suppressions
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Suppressions for ThreadSanitizer (tsan).
|
||||||
|
#
|
||||||
|
# This file is used by setting the environment variable TSAN_OPTIONS to, e.g.,
|
||||||
|
# "suppressions=$(pwd)/.tsan-suppressions". Observe that relative paths such as
|
||||||
|
# ".tsan-suppressions" might not work.
|
||||||
|
|
||||||
|
# A static variable is written to racily, but we always write the same value, so
|
||||||
|
# in practice it (hopefully!) doesn't matter.
|
||||||
|
race:^want_color$
|
||||||
|
race:^transfer_debug$
|
7
color.c
7
color.c
@ -338,6 +338,13 @@ static int check_auto_color(void)
|
|||||||
|
|
||||||
int want_color(int var)
|
int want_color(int var)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* NEEDSWORK: This function is sometimes used from multiple threads, and
|
||||||
|
* we end up using want_auto racily. That "should not matter" since
|
||||||
|
* we always write the same value, but it's still wrong. This function
|
||||||
|
* is listed in .tsan-suppressions for the time being.
|
||||||
|
*/
|
||||||
|
|
||||||
static int want_auto = -1;
|
static int want_auto = -1;
|
||||||
|
|
||||||
if (var < 0)
|
if (var < 0)
|
||||||
|
@ -1117,6 +1117,13 @@ int transport_helper_init(struct transport *transport, const char *name)
|
|||||||
__attribute__((format (printf, 1, 2)))
|
__attribute__((format (printf, 1, 2)))
|
||||||
static void transfer_debug(const char *fmt, ...)
|
static void transfer_debug(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* NEEDSWORK: This function is sometimes used from multiple threads, and
|
||||||
|
* we end up using debug_enabled racily. That "should not matter" since
|
||||||
|
* we always write the same value, but it's still wrong. This function
|
||||||
|
* is listed in .tsan-suppressions for the time being.
|
||||||
|
*/
|
||||||
|
|
||||||
va_list args;
|
va_list args;
|
||||||
char msgbuf[PBUFFERSIZE];
|
char msgbuf[PBUFFERSIZE];
|
||||||
static int debug_enabled = -1;
|
static int debug_enabled = -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user