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