<div dir="ltr">I think this case is described in <a href="https://github.com/google/sanitizers/wiki/ThreadSanitizerPopularDataRaces#data-race-on-vptr">https://github.com/google/sanitizers/wiki/ThreadSanitizerPopularDataRaces#data-race-on-vptr</a></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Mar 14, 2019 at 9:23 AM Oleg Smolsky <<a href="mailto:oleg@cohesity.com">oleg@cohesity.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I've hit a funky TSan warning: "data race on vptr (ctor/dtor vs virtual <br>
call) in StartImpl()". I fail to see a race as the object is constructed <br>
in the main thread and then a worker thread is started:<br>
<br>
struct Client : public ClientInterface {<br>
   Client() {<br>
     auto op = new Op{this};<br>
     thread_ = std::thread([op] { op->StartImpl(); });<br>
   }<br>
   ...<br>
};<br>
<br>
void Op::StartImpl() {<br>
   std::cout << "This is a race: " << owner_->VirtualFunction() << "\n";<br>
}<br>
<br>
struct TestClient : public Client {};<br>
<br>
int main(int argc, char **argv) {<br>
   TestClient().Wait();<br>
   return 0;<br>
}<br>
<br>
The full report with a minimal/complete repro is here: <br>
<a href="https://github.com/google/sanitizers/issues/1063" rel="noreferrer" target="_blank">https://github.com/google/sanitizers/issues/1063</a><br>
<br>
What am I missing? Does TSan miss the fact that all data stores happen <br>
before the worker thread is started? Or is this about the vtable pointer <br>
which is adjusted during the object's construction in the main thread?<br>
<br>
Thanks!<br>
Oleg.<br>
<br>
</blockquote></div>