On 22/09/2014 00:04, Jonathan Wakely wrote:
On 10/09/14 22:55 +0200, François Dumont wrote:
Hi

   Here is a proposal to fix this data race issue.

I finally generalized bitset approach to fix it by inheriting from the normal iterator first and then the _Safe_iterator_base type. None of the libstdc++ iterator types are final so it is fine. Surprisingly, despite inheritance being private gcc got confused between _Safe_iterator_base _M_next and forward_list _M_next so I need to adapt some code to make usage of _Safe_iterator_base _M_next explicit.

Access control in C++ is not related to visibility, name lookup still
finds private members, but it is an error to use them.

Ok, tricky.


I also consider any operator where normal iterator is being modified while the safe iterator is linked to the list of iterators. This is necessary to make sure that thread sanatizer won't consider a race condition. I didn't touch to bitset::reference because list references are only access on bitset destruction which is clearly not an operation allowed to do while playing with references in another thread.

Do you see any way to check for this problem in the testsuite ? Is there a thread sanitizer we could use ?

GCC's -fsanitize=thread option, although using it in the testsuite
would need something like dg-require-tsan so the test doesn't run on
platforms where it doesn't work, or if GCC was built without
libsanitizer.

Have you run some tests using -fsanitize=thread, even if they are not
in the testsuite?

No I hadn't and try since but without success. When I build with -fsanitize=thread the produced binary just segfault at startup. It complained about using -fPIE at compilation time and -lpie at link time but even with those options it segfault. Don't know what is going wrong. Maybe Dmitry who reported the bug could give it a try. I will ask for this on the bug ticket


Index: include/debug/safe_iterator.h
Same renaming here please, to _Iter_base.

Apart from those minor adjustments I think this looks good, but I'd
like to know that it has been tested with -fsanitize=thread, even if
only lightly tested.



I fixed the vocabulary problems. Just need a slight test then.

François

Reply via email to