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 <jcheca@redhat.com>

https://bugs.kde.org/show_bug.cgi?id=450962
This commit is contained in:
Mark Wielaard
2022-04-08 14:58:38 +02:00
parent a1bb40171a
commit 7b5867b1fd
6 changed files with 64 additions and 0 deletions

1
.gitignore vendored
View File

@@ -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

View File

@@ -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

View File

@@ -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 \

View File

@@ -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 <stdio.h>
#include <pthread.h>
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;
}

View File

@@ -0,0 +1,3 @@
prog: pth_mempcpy_false_races
vgopts: -q
stdout_filter: ../../gdbserver_tests/filter_make_empty