1603c4be006d8c53905d736bf1f19a49f5ce98276Alexey Samsonov//===-- tsan_mop.cc -------------------------------------------------------===// 2da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// The LLVM Compiler Infrastructure 4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is distributed under the University of Illinois Open Source 6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// License. See LICENSE.TXT for details. 7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector. 11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 13da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_interface.h" 14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_test_util.h" 15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "gtest/gtest.h" 16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <stddef.h> 17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <stdint.h> 18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 19da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, SimpleWrite) { 20da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t; 21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t.Write1(l); 23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 25da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, SimpleWriteWrite) { 26da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l1, l2; 28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Write1(l1); 29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Write1(l2); 30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, WriteWriteRace) { 33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Write1(l); 36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Write1(l, true); 37da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, ReadWriteRace) { 40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Read1(l); 43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Write1(l, true); 44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 46da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, WriteReadRace) { 47da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 48da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 49da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Write1(l); 50da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Read1(l, true); 51da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 52da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 53da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, ReadReadNoRace) { 54da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 55da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 56da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Read1(l); 57da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Read1(l); 58da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 59da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 60da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, WriteThenRead) { 61da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 62da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 63da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Write1(l); 64da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Read1(l); 65da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Read1(l, true); 66da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 67da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 68da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, WriteThenLockedRead) { 69da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Mutex m(Mutex::RW); 70da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MainThread t0; 71da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t0.Create(m); 72da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 73da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 74da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 75da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 76da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Write8(l); 77da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 78da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Lock(m); 79da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Read8(l); 80da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Unlock(m); 81da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 82da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Read8(l, true); 83da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 84da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t0.Destroy(m); 85da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 86da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 87da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, LockedWriteThenRead) { 88da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Mutex m(Mutex::RW); 89da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MainThread t0; 90da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t0.Create(m); 91da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 92da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 93da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 94da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 95da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Lock(m); 96da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Write8(l); 97da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Unlock(m); 98da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 99da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Read8(l); 100da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 101da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Read8(l, true); 102da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 103da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t0.Destroy(m); 104da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 105da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 106da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 107da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, RaceWithOffset) { 108da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 109da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 110da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 111da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access(l.loc(), true, 8, false); 112da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 4, true, 4, true); 113da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 114da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 115da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 116da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access(l.loc(), true, 8, false); 117da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 7, true, 1, true); 118da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 119da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 120da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 121da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access((char*)l.loc() + 4, true, 4, false); 122da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 4, true, 2, true); 123da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 124da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 125da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 126da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access((char*)l.loc() + 4, true, 4, false); 127da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 6, true, 2, true); 128da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 129da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 130da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 131da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access((char*)l.loc() + 3, true, 2, false); 132da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 4, true, 1, true); 133da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 134da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 135da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 136da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access((char*)l.loc() + 1, true, 8, false); 137da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 3, true, 1, true); 138da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 139da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 140da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 141da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, RaceWithOffset2) { 142da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 143da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 144da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 145da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access((char*)l.loc(), true, 4, false); 146da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 2, true, 1, true); 147da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 148da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 149da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 150da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access((char*)l.loc() + 2, true, 1, false); 151da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc(), true, 4, true); 152da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 153da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 154da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 155da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, NoRaceWithOffset) { 156da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 157da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 158da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 159da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access(l.loc(), true, 4, false); 160da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 4, true, 4, false); 161da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 162da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 163da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 164da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access((char*)l.loc() + 3, true, 2, false); 165da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 1, true, 2, false); 166da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Access((char*)l.loc() + 5, true, 2, false); 167da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 168da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 169da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 170da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, RaceWithDeadThread) { 171da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 172da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t; 173da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread().Write1(l); 174da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t.Write1(l, true); 175da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 176da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 177da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, BenignRaceOnVptr) { 178da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany void *vptr_storage; 179da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc vptr(&vptr_storage), val; 180da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vptr_storage = val.loc(); 181da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 182da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.VptrUpdate(vptr, val); 183da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Read8(vptr); 184da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 185da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 186da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, HarmfulRaceOnVptr) { 187da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany void *vptr_storage; 188da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc vptr(&vptr_storage), val1, val2; 189da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vptr_storage = val1.loc(); 190da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1, t2; 191da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.VptrUpdate(vptr, val2); 192da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Read8(vptr, true); 193da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 194da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 195da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void foo() { 196da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany volatile int x = 42; 197ea5bde91d547af6f38005ebdb64d7b6e4c9f966cDmitry Vyukov int x2 = x; 198ea5bde91d547af6f38005ebdb64d7b6e4c9f966cDmitry Vyukov (void)x2; 199da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 200da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 201da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void bar() { 202da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany volatile int x = 43; 203ea5bde91d547af6f38005ebdb64d7b6e4c9f966cDmitry Vyukov int x2 = x; 204ea5bde91d547af6f38005ebdb64d7b6e4c9f966cDmitry Vyukov (void)x2; 205da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 206da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 207da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, ReportDeadThread) { 208da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MemLoc l; 209da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1; 210da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 211da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t2; 212da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Call(&foo); 213da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Call(&bar); 214da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t2.Write1(l); 215da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 216da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Write1(l, true); 217da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 218da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 219da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystruct ClassWithStatic { 220da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany static int Data[4]; 221da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}; 222da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 223da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint ClassWithStatic::Data[4]; 224da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 225da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void foobarbaz() {} 226da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 227da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, ReportRace) { 228da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t1; 229da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany MainThread().Access(&ClassWithStatic::Data, true, 4, false); 230da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Call(&foobarbaz); 231da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Access(&ClassWithStatic::Data, true, 2, true); 232da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t1.Return(); 233da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 234