1 //===-- tsan_shadow_test.cpp ----------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file is a part of ThreadSanitizer (TSan), a race detector. 10 // 11 //===----------------------------------------------------------------------===// 12 #include "tsan_platform.h" 13 #include "tsan_rtl.h" 14 #include "gtest/gtest.h" 15 16 namespace __tsan { 17 18 TEST(Shadow, FastState) { 19 Shadow s(FastState(11, 22)); 20 EXPECT_EQ(s.tid(), (u64)11); 21 EXPECT_EQ(s.epoch(), (u64)22); 22 EXPECT_EQ(s.GetIgnoreBit(), false); 23 EXPECT_EQ(s.GetFreedAndReset(), false); 24 EXPECT_EQ(s.GetHistorySize(), 0); 25 EXPECT_EQ(s.addr0(), (u64)0); 26 EXPECT_EQ(s.size(), (u64)1); 27 EXPECT_EQ(s.IsWrite(), true); 28 29 s.IncrementEpoch(); 30 EXPECT_EQ(s.epoch(), (u64)23); 31 s.IncrementEpoch(); 32 EXPECT_EQ(s.epoch(), (u64)24); 33 34 s.SetIgnoreBit(); 35 EXPECT_EQ(s.GetIgnoreBit(), true); 36 s.ClearIgnoreBit(); 37 EXPECT_EQ(s.GetIgnoreBit(), false); 38 39 for (int i = 0; i < 8; i++) { 40 s.SetHistorySize(i); 41 EXPECT_EQ(s.GetHistorySize(), i); 42 } 43 s.SetHistorySize(2); 44 s.ClearHistorySize(); 45 EXPECT_EQ(s.GetHistorySize(), 0); 46 } 47 48 TEST(Shadow, Mapping) { 49 static int global; 50 int stack; 51 void *heap = malloc(0); 52 free(heap); 53 54 CHECK(IsAppMem((uptr)&global)); 55 CHECK(IsAppMem((uptr)&stack)); 56 CHECK(IsAppMem((uptr)heap)); 57 58 CHECK(IsShadowMem(MemToShadow((uptr)&global))); 59 CHECK(IsShadowMem(MemToShadow((uptr)&stack))); 60 CHECK(IsShadowMem(MemToShadow((uptr)heap))); 61 } 62 63 TEST(Shadow, Celling) { 64 u64 aligned_data[4]; 65 char *data = (char*)aligned_data; 66 CHECK_EQ((uptr)data % kShadowSize, 0); 67 uptr s0 = MemToShadow((uptr)&data[0]); 68 CHECK_EQ(s0 % kShadowSize, 0); 69 for (unsigned i = 1; i < kShadowCell; i++) 70 CHECK_EQ(s0, MemToShadow((uptr)&data[i])); 71 for (unsigned i = kShadowCell; i < 2*kShadowCell; i++) 72 CHECK_EQ(s0 + kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i])); 73 for (unsigned i = 2*kShadowCell; i < 3*kShadowCell; i++) 74 CHECK_EQ(s0 + 2*kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i])); 75 } 76 77 } // namespace __tsan 78