|
From: Bart V. A. <bar...@gm...> - 2006-08-27 14:25:54
|
Hello Julian,
You asked me to look at the drd output for pth_once. Can you please be
more specific ? By this time I looked up why drd complains about
_IO_stdfile_1_lock. The reason is simple: at least in glibc
2.3.5_IO_lock_t::cnt and _IO_lock_t::owner are accessed in a
non-threadsafe way
(_IO_lock_t is a member of _IO_FILE_plus, the datatype of
stdin/stdout/stderr). I did not yet try to analyze the other reported data
races.
>From glibc-2.3.5/nptl/sysdeps/pthread/bits/stdio-lock.h:
/* The locking here is very inexpensive, even for inlining. */
#define _IO_lock_inexpensive 1
typedef struct { int lock; int cnt; void *owner; } _IO_lock_t;
#define _IO_lock_lock(_name) \
do
{ \
void *__self =
THREAD_SELF; \
if ((_name).owner !=
__self) \
{ \
lll_lock
((_name).lock); \
(_name).owner =
__self; \
} \
++(_name).cnt; \
} while (0)
$ inst/bin/valgrind --tool=drd none/tests/pth_once
==7955== drd, a data race detector.
==7955== Copyright (C) 2006, and GNU GPL'd, by Bart Van Assche.
THIS SOFTWARE IS A PROTOTYPE, AND IS NOT YET RELEASED
==7955== Using LibVEX rev 1579, a library for dynamic binary translation.
==7955== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==7955== Using valgrind-3.3.0.SVN, a dynamic binary instrumentation
framework.
==7955== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==7955== For more details, rerun with: -v
==7955==
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955== by 0x403E9BC: pthread_create@@GLIBC_2.1 (in /lib/libpthread-
2.4.so)
==7955== by 0x401CAB3: pthread_create@* (vg_preloaded.c:135)
==7955== by 0x8048693: main (pth_once.c:65)
==7955==
==7955== 1st segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955== by 0x403E9BC: pthread_create@@GLIBC_2.1 (in /lib/libpthread-
2.4.so)
==7955== by 0x401CAB3: pthread_create@* (vg_preloaded.c:135)
==7955== by 0x8048693: main (pth_once.c:65)
==7955==
==7955== 2nd segment start (VG t 2, kernel t 7956, POSIX t 76999584)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment end (VG t 2, kernel t 7956, POSIX t 76999584)
==7955== at 0x40FB7FB: (within /lib/libc-2.4.so)
==7955== by 0x40AC654: new_do_write (in /lib/libc-2.4.so)
==7955== by 0x40AC90E: _IO_do_write@@GLIBC_2.1 (in /lib/libc-2.4.so)
==7955== by 0x40AD237: _IO_file_overflow@@GLIBC_2.1 (in /lib/libc-2.4.so)
==7955== by 0x40AFA92: __overflow (in /lib/libc-2.4.so)
==7955== by 0x40A400C: puts (in /lib/libc-2.4.so)
==7955== by 0x80485C5: welcome (pth_once.c:37)
==7955== by 0x40428BA: pthread_once (in /lib/libpthread-2.4.so)
==7955== by 0x401CB3E: vg_thread_wrapper (vg_preloaded.c:109)
==7955== by 0x403E34A: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0xBEF14FD0 sz 8 W R (stack of VG t 1; kernel t 7955; POSIX t
68605616)
==7955== 0xBEF14FD8 sz 4 W W (stack of VG t 1; kernel t 7955; POSIX t
68605616)
welcome: Welcome
identify_yourself: Hi, I'm a thread
identify_yourself: Hi, I'm a thread
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955== by 0x403E9BC: pthread_create@@GLIBC_2.1 (in /lib/libpthread-
2.4.so)
==7955== by 0x401CAB3: pthread_create@* (vg_preloaded.c:135)
==7955== by 0x8048693: main (pth_once.c:65)
==7955==
==7955== 1st segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955== by 0x403E9BC: pthread_create@@GLIBC_2.1 (in /lib/libpthread-
2.4.so)
==7955== by 0x401CAB3: pthread_create@* (vg_preloaded.c:135)
==7955== by 0x8048693: main (pth_once.c:65)
==7955==
==7955== 2nd segment start (VG t 2, kernel t 7956, POSIX t 76999584)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment end (VG t 2, kernel t 7956, POSIX t 76999584)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x0404A110 sz 4 W W (__nptl_nthreads (offset 0, size 4) in
/lib/libpthread-2.4.so, libpthread.so.0:Data)
identify_yourself: Hi, I'm a thread
identify_yourself: Hi, I'm a thread
identify_yourself: Hi, I'm a thread
identify_yourself: Hi, I'm a thread
identify_yourself: Hi, I'm a thread
identify_yourself: Hi, I'm a thread
identify_yourself: Hi, I'm a thread
identify_yourself: Hi, I'm a thread
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 2, kernel t 7956, POSIX t 76999584)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 2, kernel t 7956, POSIX t 76999584)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955== by 0x403E9BC: pthread_create@@GLIBC_2.1 (in /lib/libpthread-
2.4.so)
==7955== by 0x401CAB3: pthread_create@* (vg_preloaded.c:135)
==7955== by 0x8048693: main (pth_once.c:65)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x0401B310 sz 4 W W (_rtld_local (offset 752, size 1524) in
/lib/ld-2.4.so, ld-linux.so.2:Data)
==7955== 0x0403817D sz 1 W W (heap)
==7955== 0x0496EC04 sz 4 W W (stack of VG t 2; kernel t 7956; POSIX t
76999584)
==7955== 0x0496ED9C sz 4 R W (stack of VG t 2; kernel t 7956; POSIX t
76999584)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 2, kernel t 7956, POSIX t 76999584)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 2, kernel t 7956, POSIX t 76999584)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 3, kernel t 7957, POSIX t 85392288)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment end (VG t 3, kernel t 7957, POSIX t 85392288)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x0401E000 sz 36 W W (heap)
==7955== 0x040383FD sz 1 W W (heap)
==7955== 0x0404A020 sz 4 R W ( /lib/libpthread-2.4.so, libpthread.so.0:Data)
==7955== 0x0404A0E8 sz 4 W R ( /lib/libpthread-2.4.so, libpthread.so.0:Data)
==7955== 0x041694E0 sz 4 W R (_IO_2_1_stdout_ (offset 0, size 152) in
/lib/libc-2.4.so, libc.so.6:Data)
==7955== 0x041694E4 sz 4 W W (_IO_2_1_stdout_ (offset 4, size 152) in
/lib/libc-2.4.so, libc.so.6:Data)
==7955== 0x041694E8 sz 4 W W (_IO_2_1_stdout_ (offset 8, size 152) in
/lib/libc-2.4.so, libc.so.6:Data)
==7955== 0x041694EC sz 4 W W (_IO_2_1_stdout_ (offset 12, size 152) in
/lib/libc-2.4.so, libc.so.6:Data)
==7955== 0x041694F0 sz 12 W W (_IO_2_1_stdout_ (offset 16, size 152) in
/lib/libc-2.4.so, libc.so.6:Data)
==7955== 0x041694FC sz 8 W R (_IO_2_1_stdout_ (offset 28, size 152) in
/lib/libc-2.4.so, libc.so.6:Data)
==7955== 0x04169548 sz 4 W R (_IO_2_1_stdout_ (offset 104, size 152) in
/lib/libc-2.4.so, libc.so.6:Data)
==7955== 0x0416A0D0 sz 12 W W (_IO_stdfile_1_lock (offset 0, size 12) in
/lib/libc-2.4.so, libc.so.6:BSS)
==7955== 0x08049960 sz 4 W R (
/home/bart/software/valgrind-svn/none/tests/pth_once, NONE:Data)
==7955== 0x08049968 sz 4 W R (
/home/bart/software/valgrind-svn/none/tests/pth_once, NONE:Data)
==7955== 0x08049994 sz 4 W W (welcome_once_block (offset 0, size 4) in
/home/bart/software/valgrind-svn/none/tests/pth_once, NONE:BSS)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 3, kernel t 7957, POSIX t 85392288)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 3, kernel t 7957, POSIX t 85392288)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x0516FC04 sz 4 W W (stack of VG t 3; kernel t 7957; POSIX t
85392288)
==7955== 0x0516FD9C sz 4 R W (stack of VG t 3; kernel t 7957; POSIX t
85392288)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 4, kernel t 7958, POSIX t 93784992)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 4, kernel t 7958, POSIX t 93784992)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x05970C04 sz 4 W W (stack of VG t 4; kernel t 7958; POSIX t
93784992)
==7955== 0x05970D9C sz 4 R W (stack of VG t 4; kernel t 7958; POSIX t
93784992)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 5, kernel t 7959, POSIX t 102177696)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 5, kernel t 7959, POSIX t 102177696)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x06171C04 sz 4 W W (stack of VG t 5; kernel t 7959; POSIX t
102177696)
==7955== 0x06171D9C sz 4 R W (stack of VG t 5; kernel t 7959; POSIX t
102177696)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 6, kernel t 7960, POSIX t 110570400)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 6, kernel t 7960, POSIX t 110570400)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x06972C04 sz 4 W W (stack of VG t 6; kernel t 7960; POSIX t
110570400)
==7955== 0x06972D9C sz 4 R W (stack of VG t 6; kernel t 7960; POSIX t
110570400)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 7, kernel t 7961, POSIX t 118963104)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 7, kernel t 7961, POSIX t 118963104)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x07173C04 sz 4 W W (stack of VG t 7; kernel t 7961; POSIX t
118963104)
==7955== 0x07173D9C sz 4 R W (stack of VG t 7; kernel t 7961; POSIX t
118963104)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 8, kernel t 7962, POSIX t 127355808)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 8, kernel t 7962, POSIX t 127355808)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x07974C04 sz 4 W W (stack of VG t 8; kernel t 7962; POSIX t
127355808)
==7955== 0x07974D9C sz 4 R W (stack of VG t 8; kernel t 7962; POSIX t
127355808)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 9, kernel t 7963, POSIX t 151301024)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 9, kernel t 7963, POSIX t 151301024)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x0904AC04 sz 4 W W (stack of VG t 9; kernel t 7963; POSIX t
151301024)
==7955== 0x0904AD9C sz 4 R W (stack of VG t 9; kernel t 7963; POSIX t
151301024)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 10, kernel t 7964, POSIX t 159693728)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 10, kernel t 7964, POSIX t 159693728)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x0984BC04 sz 4 W W (stack of VG t 10; kernel t 7964; POSIX t
159693728)
==7955== 0x0984BD9C sz 4 R W (stack of VG t 10; kernel t 7964; POSIX t
159693728)
==7955==
----------------------------------------------------------------------
==7955== 1st segment start (VG t 11, kernel t 7965, POSIX t 168086432)
==7955== at 0x410A648: clone (in /lib/libc-2.4.so)
==7955==
==7955== 1st segment end (VG t 11, kernel t 7965, POSIX t 168086432)
==7955== at 0x403E3BD: start_thread (in /lib/libpthread-2.4.so)
==7955== by 0x410A65D: clone (in /lib/libc-2.4.so)
==7955==
==7955== 2nd segment start (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== 2nd segment end (VG t 1, kernel t 7955, POSIX t 68605616)
==7955== at 0x401C4FE: pthread_join (vg_preloaded.c:164)
==7955== by 0x80486EF: main (pth_once.c:76)
==7955==
==7955== Data addresses accessed by both segments:
==7955== 0x0A04CC04 sz 4 W W (stack of VG t 11; kernel t 7965; POSIX t
168086432)
==7955== 0x0A04CD9C sz 4 R W (stack of VG t 11; kernel t 7965; POSIX t
168086432)
main: Goodbye
==7955==
==7955== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
|