tsan_stack_test.cc revision 01a7ce809bf7cc627d73c045c70bcca9891f632c
1//===-- tsan_stack_test.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_sync.h" 14#include "tsan_rtl.h" 15#include "gtest/gtest.h" 16#include <string.h> 17 18namespace __tsan { 19 20static void TestStackTrace(StackTrace *trace) { 21 ThreadState thr(0, 0, 0, 0, 0, 0, 0, 0); 22 uptr stack[128]; 23 thr.shadow_stack = &stack[0]; 24 thr.shadow_stack_pos = &stack[0]; 25 thr.shadow_stack_end = &stack[128]; 26 27 trace->ObtainCurrent(&thr, 0); 28 EXPECT_EQ(trace->Size(), (uptr)0); 29 30 trace->ObtainCurrent(&thr, 42); 31 EXPECT_EQ(trace->Size(), (uptr)1); 32 EXPECT_EQ(trace->Get(0), (uptr)42); 33 34 *thr.shadow_stack_pos++ = 100; 35 *thr.shadow_stack_pos++ = 101; 36 trace->ObtainCurrent(&thr, 0); 37 EXPECT_EQ(trace->Size(), (uptr)2); 38 EXPECT_EQ(trace->Get(0), (uptr)100); 39 EXPECT_EQ(trace->Get(1), (uptr)101); 40 41 trace->ObtainCurrent(&thr, 42); 42 EXPECT_EQ(trace->Size(), (uptr)3); 43 EXPECT_EQ(trace->Get(0), (uptr)100); 44 EXPECT_EQ(trace->Get(1), (uptr)101); 45 EXPECT_EQ(trace->Get(2), (uptr)42); 46} 47 48TEST(StackTrace, Basic) { 49 ScopedInRtl in_rtl; 50 StackTrace trace; 51 TestStackTrace(&trace); 52} 53 54TEST(StackTrace, StaticBasic) { 55 ScopedInRtl in_rtl; 56 uptr buf[10]; 57 StackTrace trace1(buf, 10); 58 TestStackTrace(&trace1); 59 StackTrace trace2(buf, 3); 60 TestStackTrace(&trace2); 61} 62 63TEST(StackTrace, StaticTrim) { 64 ScopedInRtl in_rtl; 65 uptr buf[2]; 66 StackTrace trace(buf, 2); 67 68 ThreadState thr(0, 0, 0, 0, 0, 0, 0, 0); 69 uptr stack[128]; 70 thr.shadow_stack = &stack[0]; 71 thr.shadow_stack_pos = &stack[0]; 72 thr.shadow_stack_end = &stack[128]; 73 74 *thr.shadow_stack_pos++ = 100; 75 *thr.shadow_stack_pos++ = 101; 76 *thr.shadow_stack_pos++ = 102; 77 trace.ObtainCurrent(&thr, 0); 78 EXPECT_EQ(trace.Size(), (uptr)2); 79 EXPECT_EQ(trace.Get(0), (uptr)101); 80 EXPECT_EQ(trace.Get(1), (uptr)102); 81 82 trace.ObtainCurrent(&thr, 42); 83 EXPECT_EQ(trace.Size(), (uptr)2); 84 EXPECT_EQ(trace.Get(0), (uptr)102); 85 EXPECT_EQ(trace.Get(1), (uptr)42); 86} 87 88 89} // namespace __tsan 90