From 74e20007467b930fb14264519f74a45179b5f740 Mon Sep 17 00:00:00 2001 From: Paul Floyd Date: Tue, 3 Jan 2023 21:28:42 +0100 Subject: [PATCH] =?utf8?q?Bug=C2=A0327548=20-=20false=20positive=20while?= =?utf8?q?=20destroying=20mutex?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + NEWS | 1 + helgrind/hg_intercepts.c | 4 +++ helgrind/tests/Makefile.am | 2 ++ helgrind/tests/bug327548.c | 50 +++++++++++++++++++++++++++++ helgrind/tests/bug327548.stderr.exp | 0 helgrind/tests/bug327548.vgtest | 2 ++ 7 files changed, 60 insertions(+) create mode 100644 helgrind/tests/bug327548.c create mode 100644 helgrind/tests/bug327548.stderr.exp create mode 100644 helgrind/tests/bug327548.vgtest diff --git a/.gitignore b/.gitignore index 20282b8a20..4277dd2a6f 100644 --- a/.gitignore +++ b/.gitignore @@ -653,6 +653,7 @@ /helgrind/tests/bar_bad /helgrind/tests/bar_trivial /helgrind/tests/bug322621 +/helgrind/tests/bug327548 /helgrind/tests/bug392331 /helgrind/tests/cond_init_destroy /helgrind/tests/cond_timedwait_invalid diff --git a/NEWS b/NEWS index f73541187a..27fe0df194 100644 --- a/NEWS +++ b/NEWS @@ -40,6 +40,7 @@ than mailing the developers (or mailing lists) directly -- bugs that are not entered into bugzilla tend to get forgotten about or ignored. 170510 Don't warn about ioctl of size 0 without direction hint +327548 false positive while destroying mutex 351857 confusing error message about valid command line option 392331 Spurious lock not held error from inside pthread_cond_timedwait 400793 pthread_rwlock_timedwrlock false positive diff --git a/helgrind/hg_intercepts.c b/helgrind/hg_intercepts.c index 5a83996e36..8c98e4ee03 100644 --- a/helgrind/hg_intercepts.c +++ b/helgrind/hg_intercepts.c @@ -879,7 +879,9 @@ static int mutex_destroy_WRK(pthread_mutex_t *mutex) if (mutex != NULL) { static const pthread_mutex_t mutex_init = PTHREAD_MUTEX_INITIALIZER; + VALGRIND_HG_DISABLE_CHECKING(mutex, sizeof(*mutex)); mutex_is_init = my_memcmp(mutex, &mutex_init, sizeof(*mutex)) == 0; + VALGRIND_HG_ENABLE_CHECKING(mutex, sizeof(*mutex)); } else { mutex_is_init = 0; } @@ -1785,7 +1787,9 @@ static int pthread_cond_destroy_WRK(pthread_cond_t* cond) if (cond != NULL) { const pthread_cond_t cond_init = PTHREAD_COND_INITIALIZER; + VALGRIND_HG_DISABLE_CHECKING(cond, sizeof(*cond)); cond_is_init = my_memcmp(cond, &cond_init, sizeof(*cond)) == 0; + VALGRIND_HG_ENABLE_CHECKING(cond, sizeof(*cond)); } else { cond_is_init = 0; } diff --git a/helgrind/tests/Makefile.am b/helgrind/tests/Makefile.am index ac6b15af77..721749f1ce 100755 --- a/helgrind/tests/Makefile.am +++ b/helgrind/tests/Makefile.am @@ -16,6 +16,7 @@ EXTRA_DIST = \ annotate_smart_pointer.vgtest annotate_smart_pointer.stdout.exp \ annotate_smart_pointer.stderr.exp \ bug322621.vgtest bug322621.stderr.exp \ + bug327548.vgtest bug327548.stderr.exp \ bug392331.vgtest bug392331.stdout.exp bug392331.stderr.exp \ bug392331_supp.vgtest bug392331_supp.stdout.exp bug392331_supp.stderr.exp \ bug392331.supp \ @@ -146,6 +147,7 @@ noinst_HEADERS = safe-pthread.h safe-semaphore.h # should be conditionally compiled like tc20_verifywrap is. check_PROGRAMS = \ annotate_hbefore \ + bug327548 \ cond_init_destroy \ cond_timedwait_invalid \ cond_timedwait_test \ diff --git a/helgrind/tests/bug327548.c b/helgrind/tests/bug327548.c new file mode 100644 index 0000000000..7b6e8a9ced --- /dev/null +++ b/helgrind/tests/bug327548.c @@ -0,0 +1,50 @@ +#include +#include +#include + +sem_t sem; +pthread_cond_t cond; +pthread_mutex_t mutex; +int finished; + +void *f(void *foo) { + while(1) + { + /* Wait for main() to have built mutex/cond */ + sem_wait(&sem); + + pthread_mutex_lock(&mutex); + finished = 1; + pthread_cond_signal(&cond); + pthread_mutex_unlock(&mutex); + } + return NULL; +} + +int main(void) { + pthread_t t; + sem_init(&sem, 0, 0); + int count = 1000; + + pthread_create(&t, NULL, f, NULL); + + while (count--) + { + pthread_mutex_init(&mutex, NULL); + pthread_cond_init(&cond, NULL); + + pthread_mutex_lock(&mutex); + /* Tell thread there is a new item to process */ + sem_post(&sem); + while (!finished) + pthread_cond_wait(&cond, &mutex); + pthread_mutex_unlock(&mutex); + + finished = 0; + + pthread_cond_destroy(&cond); + pthread_mutex_destroy(&mutex); + } + + return 0; +} diff --git a/helgrind/tests/bug327548.stderr.exp b/helgrind/tests/bug327548.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helgrind/tests/bug327548.vgtest b/helgrind/tests/bug327548.vgtest new file mode 100644 index 0000000000..e064b32572 --- /dev/null +++ b/helgrind/tests/bug327548.vgtest @@ -0,0 +1,2 @@ +vgopts: -q +prog: bug327548 -- 2.47.2