1//===-- tsan_string.cc ----------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file is a part of ThreadSanitizer (TSan), a race detector. 11// 12//===----------------------------------------------------------------------===// 13#include "tsan_test_util.h" 14#include "gtest/gtest.h" 15#include <string.h> 16 17namespace __tsan { 18 19TEST(ThreadSanitizer, Memcpy) { 20 char data0[7] = {1, 2, 3, 4, 5, 6, 7}; 21 char data[7] = {42, 42, 42, 42, 42, 42, 42}; 22 MainThread().Memcpy(data+1, data0+1, 5); 23 EXPECT_EQ(data[0], 42); 24 EXPECT_EQ(data[1], 2); 25 EXPECT_EQ(data[2], 3); 26 EXPECT_EQ(data[3], 4); 27 EXPECT_EQ(data[4], 5); 28 EXPECT_EQ(data[5], 6); 29 EXPECT_EQ(data[6], 42); 30 MainThread().Memset(data+1, 13, 5); 31 EXPECT_EQ(data[0], 42); 32 EXPECT_EQ(data[1], 13); 33 EXPECT_EQ(data[2], 13); 34 EXPECT_EQ(data[3], 13); 35 EXPECT_EQ(data[4], 13); 36 EXPECT_EQ(data[5], 13); 37 EXPECT_EQ(data[6], 42); 38} 39 40TEST(ThreadSanitizer, MemcpyRace1) { 41 char *data = new char[10]; 42 char *data1 = new char[10]; 43 char *data2 = new char[10]; 44 ScopedThread t1, t2; 45 t1.Memcpy(data, data1, 10); 46 t2.Memcpy(data, data2, 10, true); 47} 48 49// The test fails with TSAN_SHADOW_COUNT=2, 50// because the old racy access is evicted. 51#if defined(TSAN_SHADOW_COUNT) && TSAN_SHADOW_COUNT >= 4 52TEST(ThreadSanitizer, MemcpyRace2) { 53 char *data = new char[10]; 54 char *data1 = new char[10]; 55 char *data2 = new char[10]; 56 ScopedThread t1, t2; 57 t1.Memcpy(data+5, data1, 1); 58 t2.Memcpy(data+3, data2, 4, true); 59} 60#endif 61 62TEST(ThreadSanitizer, MemcpyRace3) { 63 char *data = new char[10]; 64 char *data1 = new char[10]; 65 char *data2 = new char[10]; 66 ScopedThread t1, t2; 67 t1.Memcpy(data, data1, 10); 68 t2.Memcpy(data1, data2, 10, true); 69} 70 71TEST(ThreadSanitizer, MemcpyStack) { 72 char *data = new char[10]; 73 char *data1 = new char[10]; 74 ScopedThread t1, t2; 75 t1.Memcpy(data, data1, 10); 76 t2.Memcpy(data, data1, 10, true); 77} 78 79TEST(ThreadSanitizer, MemsetRace1) { 80 char *data = new char[10]; 81 ScopedThread t1, t2; 82 t1.Memset(data, 1, 10); 83 t2.Memset(data, 2, 10, true); 84} 85 86} // namespace __tsan 87