From: Bart Van Assche Date: Sun, 12 Apr 2020 23:31:49 +0000 (-0700) Subject: drd/drd_pthread_intercepts: Add a workaround for what is probably a compiler bug X-Git-Tag: VALGRIND_3_16_0~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=52d02fe239117c76bdc0fe4b12e85b9156dc4269;p=thirdparty%2Fvalgrind.git drd/drd_pthread_intercepts: Add a workaround for what is probably a compiler bug Without this patch drd produces incorrect output for some test cases. It seems like without this patch an incorrect value is passed as the sixth argument of VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__POST_SEM_OPEN, ...): $ ./vg-in-place --tool=drd --traemaphore=yes drd/tests/sem_open -m -p drd, a thread error detector Copyright (C) 2006-2017, and GNU GPL'd, by Bart Van Assche. Using Valgrind-3.16.0.GIT and LibVEX; rerun with -h for copyright info Command: drd/tests/sem_open -m -p [1] sem_open 0x4029000 name /drd-sem-open-test-27725 oflag 0xc0 mode 0600 value 0 s_d1 = 1 (should be 1) [2] sem_wait 0x4029000 value 0 -> 4294967295 Thread 2: Invalid semaphore: semaphore 0x4029000 at 0x484ADC7: sem_wait_intercept (drd_pthread_intercepts.c:1436) by 0x484ADC7: sem_wait@* (drd_pthread_intercepts.c:1441) by 0x4014A9: thread_func (sem_open.c:114) by 0x483FEA6: vgDrd_thread_wrapper (drd_pthread_intercepts.c:449) by 0x4886EF9: start_thread (in /lib64/libpthread-2.31.so) by 0x499F3BE: clone (in /lib64/libc-2.31.so) semaphore 0x4029000 was first observed at: at 0x484A395: sem_open_intercept (drd_pthread_intercepts.c:1403) by 0x484A395: sem_open (drd_pthread_intercepts.c:1409) by 0x4012CE: main (sem_open.c:63) [2] sem_post 0x4029000 value 4294967295 -> 0 [1] sem_wait 0x4029000 value 0 -> 4294967295 Thread 1: Invalid semaphore: semaphore 0x4029000 at 0x484ADC7: sem_wait_intercept (drd_pthread_intercepts.c:1436) by 0x484ADC7: sem_wait@* (drd_pthread_intercepts.c:1441) by 0x40139D: main (sem_open.c:90) semaphore 0x4029000 was first observed at: at 0x484A395: sem_open_intercept (drd_pthread_intercepts.c:1403) by 0x484A395: sem_open (drd_pthread_intercepts.c:1409) by 0x4012CE: main (sem_open.c:63) Conflicting load by thread 1 at 0x00404108 size 8 at 0x40139E: main (sem_open.c:91) Allocation context: BSS section of /home/bart/software/valgrind.git/drd/tests/sem_open Other segment start (thread 2) (thread finished, call stack no longer available) Other segment end (thread 2) (thread finished, call stack no longer available) Conflicting store by thread 1 at 0x00404108 size 8 at 0x4013B2: main (sem_open.c:91) Allocation context: BSS section of /home/bart/software/valgrind.git/drd/tests/sem_open Other segment start (thread 2) (thread finished, call stack no longer available) Other segment end (thread 2) (thread finished, call stack no longer available) [1] sem_post 0x4029000 value 4294967295 -> 0 s_d2 = 2 (should be 2) s_d3 = 5 (should be 5) [1] sem_close 0x4029000 value 0 For lists of detected and suppressed errors, rerun with: -s ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 18 from 8) --- diff --git a/drd/drd_pthread_intercepts.c b/drd/drd_pthread_intercepts.c index bb5b9dadba..58c45aaec8 100644 --- a/drd/drd_pthread_intercepts.c +++ b/drd/drd_pthread_intercepts.c @@ -1400,6 +1400,9 @@ sem_t* sem_open_intercept(const char *name, int oflag, mode_t mode, VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__PRE_SEM_OPEN, name, oflag, mode, value, 0); CALL_FN_W_WWWW(ret, fn, name, oflag, mode, value); + // To do: figure out why gcc 9.2.1 miscompiles this function if the printf() + // call below is left out. + printf(""); VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__POST_SEM_OPEN, ret != SEM_FAILED ? ret : 0, name, oflag, mode, value);