From: Mark Wielaard Date: Fri, 8 Apr 2022 12:58:38 +0000 (+0200) Subject: helgrind reports false races for printfs using mempcpy on FILE* state X-Git-Tag: VALGRIND_3_19_0~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b5867b1f;p=thirdparty%2Fvalgrind.git helgrind reports false races for printfs using mempcpy on FILE* state We already have a suppression for helgrind which is for when glibc uses __GI_mempcpy to manipulate internal FILE state (this was bug 352130). But since glibc-2.26 mempcpy is used instead __GI_mempcpy, making the suppresion from the original bug obsolete. This patch adds a new suppression using mempcpy but doesn't replace the original suppression for older systems. Patch adding suppression + testcase by Jesus Checa https://bugs.kde.org/show_bug.cgi?id=450962 --- diff --git a/.gitignore b/.gitignore index 5026fcbc78..94ff17d299 100644 --- a/.gitignore +++ b/.gitignore @@ -666,6 +666,7 @@ /helgrind/tests/Makefile.in /helgrind/tests/pth_barrier /helgrind/tests/pth_destroy_cond +/helgrind/tests/pth_mempcpy_false_races /helgrind/tests/rwlock_race /helgrind/tests/rwlock_test /helgrind/tests/shmem_abits diff --git a/glibc-2.X-helgrind.supp.in b/glibc-2.X-helgrind.supp.in index cecf3ceab9..8e1a10fa55 100644 --- a/glibc-2.X-helgrind.supp.in +++ b/glibc-2.X-helgrind.supp.in @@ -54,6 +54,14 @@ obj:@GLIBC_LIBC_PATH@ } +{ + helgrind-glibc-io-xsputn-mempcpy-glibc2-26+ + Helgrind:Race + fun:mempcpy + fun:_IO_*xsputn* + obj:@GLIBC_LIBC_PATH@ +} + { helgrind-glibc2X-005 Helgrind:Race diff --git a/helgrind/tests/Makefile.am b/helgrind/tests/Makefile.am index cf7f76d46a..05e145f7b8 100755 --- a/helgrind/tests/Makefile.am +++ b/helgrind/tests/Makefile.am @@ -58,6 +58,7 @@ EXTRA_DIST = \ pth_cond_destroy_busy.stderr.exp-ppc64 \ pth_cond_destroy_busy.stderr.exp-solaris \ pth_cond_destroy_busy.stderr.exp-freebsd \ + pth_mempcpy_false_races.vgtest pth_mempcpy_false_races.stderr.exp \ pth_spinlock.vgtest pth_spinlock.stdout.exp pth_spinlock.stderr.exp \ rwlock_race.vgtest rwlock_race.stdout.exp rwlock_race.stderr.exp \ rwlock_test.vgtest rwlock_test.stdout.exp rwlock_test.stderr.exp \ @@ -152,6 +153,7 @@ check_PROGRAMS = \ locked_vs_unlocked2 \ locked_vs_unlocked3 \ pth_destroy_cond \ + pth_mempcpy_false_races \ shmem_abits \ stackteardown \ t2t \ diff --git a/helgrind/tests/pth_mempcpy_false_races.c b/helgrind/tests/pth_mempcpy_false_races.c new file mode 100644 index 0000000000..90716435d6 --- /dev/null +++ b/helgrind/tests/pth_mempcpy_false_races.c @@ -0,0 +1,50 @@ +/* Related bugs: + * https://bugs.kde.org/show_bug.cgi?id=352130 + * https://bugs.kde.org/show_bug.cgi?id=450962 + * This reproducer has no real race conditions but since helgrind doesn't see + * or know about the glibc internal locking done for FILE *state, it will report + * a race when several threads run printf due to this fact. + */ + +#include +#include + +pthread_t thread; + +void* thread3 (void* d) +{ + int count3 = 0; + + while(count3 < 100){ + printf("Thread 3: %d\n", count3++); + } + return NULL; +} + +void* thread2 (void* d) +{ + int count2 = 0; + + while(count2 < 1000){ + // + printf("Thread 2: %d\n", count2++); + } + return NULL; +} + +int main (){ + + pthread_create (&thread, NULL, thread2, NULL); + pthread_create (&thread, NULL, thread3, NULL); + + //Thread 1 + int count1 = 0; + + while(count1 < 10){ + printf("Thread 1: %d\n", count1++); + } + + pthread_join(thread,NULL); + return 0; +} + diff --git a/helgrind/tests/pth_mempcpy_false_races.stderr.exp b/helgrind/tests/pth_mempcpy_false_races.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helgrind/tests/pth_mempcpy_false_races.vgtest b/helgrind/tests/pth_mempcpy_false_races.vgtest new file mode 100644 index 0000000000..9e3c6d4b45 --- /dev/null +++ b/helgrind/tests/pth_mempcpy_false_races.vgtest @@ -0,0 +1,3 @@ +prog: pth_mempcpy_false_races +vgopts: -q +stdout_filter: ../../gdbserver_tests/filter_make_empty