diff options
| -rw-r--r-- | src/socket_wrapper.c | 6 | ||||
| -rw-r--r-- | tests/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | tests/helgrind.supp | 11 |
3 files changed, 18 insertions, 1 deletions
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index 36482c6..7a27b40 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -659,6 +659,12 @@ static void swrap_mutex_unlock(pthread_mutex_t *mutex) } } +/* + * These macros have a thread race condition on purpose! + * + * This is an optimization to avoid locking each time we check if the symbol is + * bound. + */ #define swrap_bind_symbol_libc(sym_name) \ if (swrap.libc.symbols._libc_##sym_name.obj == NULL) { \ swrap_mutex_lock(&libc_symbol_binding_mutex); \ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 068af00..6884473 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -73,7 +73,7 @@ endforeach() if (HELGRIND_TESTING) find_program(VALGRIND_EXECUTABLE valgrind) if (VALGRIND_EXECUTABLE) - set(VALGRIND_HELGRIND_OPTIONS -v --trace-children=yes --tool=helgrind --error-exitcode=1 --read-var-info=yes) + set(VALGRIND_HELGRIND_OPTIONS -v --trace-children=yes --tool=helgrind --error-exitcode=1 --read-var-info=yes --suppressions=${CMAKE_CURRENT_SOURCE_DIR}/helgrind.supp) foreach(_TEST ${SWRAP_THREADED_TESTS}) set(_HELGRIND_TEST "helgrind_${_TEST}") diff --git a/tests/helgrind.supp b/tests/helgrind.supp new file mode 100644 index 0000000..733f714 --- /dev/null +++ b/tests/helgrind.supp @@ -0,0 +1,11 @@ +# The swrap_bind_symbol_lib* macros have a thread race condition on purpose! +# +# As an optimization we do not lock the access. However if the obj is not +# bound, we lock it with a mutex and reread it again. And binding the symbol is +# protected. +{ + SWRAP_SYMBOL_ACCESS + Helgrind:Race + fun:libc_* + fun:swrap_* +} |
