From: Paul Floyd Date: Tue, 3 Jan 2023 20:28:42 +0000 (+0100) Subject: BugĀ 327548 - false positive while destroying mutex X-Git-Tag: VALGRIND_3_21_0~243 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=74e20007467b930fb14264519f74a45179b5f740;p=thirdparty%2Fvalgrind.git BugĀ 327548 - false positive while destroying mutex --- 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