Podczas pracy z odkażaczem nici Clanga zauważyliśmy ostrzeżenia o wyścigach danych. Uważamy, że jest to spowodowane techniką kopiowania na piśmie std :: string, która nie jest bezpieczna dla wątków, ale możemy się mylić. Zredukowaliśmy ostrzeżenie byliśmy zobaczyć, aby ten kod:Ostrzeżenie odkażania wątku Clang podczas korzystania ze std :: string w środowisku wielowątkowym
void test3() {
std::unique_ptr<std::thread> thread;
{
auto output = make_shared<string>();
std::string str = "test";
thread.reset(new std::thread([str, output]() { *output += str; }));
// The str string now goes out of scope but due to COW
// the captured string may not have the copy of the content yet.
}
thread->join();
}
Kiedy skompilowany z gwintem odkażającego włączona:
clang++ -stdlib=libc++ -std=c++11 -O0 -g -fsanitize=thread -lpthread -o test main.cpp
lub
clang++ -std=c++11 -O0 -g -fsanitize=thread -lpthread -o test main.cpp
A kiedy uruchomić wiele razy, że w końcu daje to ostrzeżenie:
WARNING: ThreadSanitizer: data race (pid=30829)
Write of size 8 at 0x7d0c0000bef8 by thread T62:
#0 operator delete(void*) <null>:0
...
Previous write of size 1 at 0x7d0c0000befd by thread T5:
#0 std::__1::char_traits<char>::assign(char&, char const&) string:639
...
Czy jest to fałszywy pozytyw od odkażacza nici czy jest to prawdziwy wyścig danych? Jeśli później, można go obejść bez zmiany kodu (na przykład przez przekazanie niektórych flag do kompilatora), czy jest to znany błąd w impedancji łańcuchowej (lub coś innego)?
UPDATE: dzyń --version wyjścia:
Ubuntu clang version 3.5-1ubuntu1 (trunk) (based on LLVM 3.5)
Target: x86_64-pc-linux-gnu
Thread model: posix
UPDATE: The cpp użyć do odtworzenia tego ostrzeżenia.
libC++ nie powinien używać ciągów COW, więc byłbym zaskoczony, gdyby to były ciągi COW. – hvd
@BartoszKP, tak, przepraszam, ten problem z KOW był po prostu naszym domysłem popartym rozumowaniem w teście. Zasadniczo potrzebujemy, aby wątek kodu był bezpieczny, problem polega na tym, że czasami otrzymujemy podobne ostrzeżenia od wewnątrz, np. boost :: asio, więc nie zawsze jesteśmy w stanie zmienić kod. –
Odkażanie nici clang jest świetnym narzędziem, ale bardzo trudno jest poprawnie zinterpretować wszystkie rodzaje muteksów i inne techniki synchronizacji. Tak może być w tym przypadku - otrzymałem od niego fałszywe alarmy, ponieważ na przykład nie rozumieją muteksów Qt. – BartoszKP