]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
BugĀ 327548 - false positive while destroying mutex
authorPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 3 Jan 2023 20:28:42 +0000 (21:28 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 3 Jan 2023 20:28:42 +0000 (21:28 +0100)
.gitignore
NEWS
helgrind/hg_intercepts.c
helgrind/tests/Makefile.am
helgrind/tests/bug327548.c [new file with mode: 0644]
helgrind/tests/bug327548.stderr.exp [new file with mode: 0644]
helgrind/tests/bug327548.vgtest [new file with mode: 0644]

index 20282b8a20db43315021d38c82198d43395df121..4277dd2a6f035e7457442ec74f27865d754dde20 100644 (file)
 /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 f73541187adee5a6b99579682d849f26f3a3ee56..27fe0df19480118296d5bf576d6131ef9b0077f0 100644 (file)
--- 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
index 5a83996e365adf9fce0ebb60ab46913edbc798d0..8c98e4ee032ba9e3d0408e9485ee96392549623b 100644 (file)
@@ -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;
    }
index ac6b15af776d8187dcd0b6ec42ed191f33d82d8a..721749f1ce60db4b2c923ab14e1f7b36b374bd1d 100755 (executable)
@@ -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 (file)
index 0000000..7b6e8a9
--- /dev/null
@@ -0,0 +1,50 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <semaphore.h>
+
+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 (file)
index 0000000..e69de29
diff --git a/helgrind/tests/bug327548.vgtest b/helgrind/tests/bug327548.vgtest
new file mode 100644 (file)
index 0000000..e064b32
--- /dev/null
@@ -0,0 +1,2 @@
+vgopts: -q
+prog: bug327548