tsan_stack_test.cc revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
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, 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  StackTrace trace;
50  TestStackTrace(&trace);
51}
52
53TEST(StackTrace, StaticBasic) {
54  uptr buf[10];
55  StackTrace trace1(buf, 10);
56  TestStackTrace(&trace1);
57  StackTrace trace2(buf, 3);
58  TestStackTrace(&trace2);
59}
60
61TEST(StackTrace, StaticTrim) {
62  uptr buf[2];
63  StackTrace trace(buf, 2);
64
65  ThreadState thr(0, 0, 0, 0, 0, 0, 0, 0, 0);
66  uptr stack[128];
67  thr.shadow_stack = &stack[0];
68  thr.shadow_stack_pos = &stack[0];
69  thr.shadow_stack_end = &stack[128];
70
71  *thr.shadow_stack_pos++ = 100;
72  *thr.shadow_stack_pos++ = 101;
73  *thr.shadow_stack_pos++ = 102;
74  trace.ObtainCurrent(&thr, 0);
75  EXPECT_EQ(trace.Size(), (uptr)2);
76  EXPECT_EQ(trace.Get(0), (uptr)101);
77  EXPECT_EQ(trace.Get(1), (uptr)102);
78
79  trace.ObtainCurrent(&thr, 42);
80  EXPECT_EQ(trace.Size(), (uptr)2);
81  EXPECT_EQ(trace.Get(0), (uptr)102);
82  EXPECT_EQ(trace.Get(1), (uptr)42);
83}
84
85
86}  // namespace __tsan
87