brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · ba3fbb3 Raw
86 lines · cpp
1//===-- tsan_stack_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-exception6//7//===----------------------------------------------------------------------===//8//9// This file is a part of ThreadSanitizer (TSan), a race detector.10//11//===----------------------------------------------------------------------===//12#include "tsan_sync.h"13#include "tsan_rtl.h"14#include "gtest/gtest.h"15#include <string.h>16 17namespace __tsan {18 19template <typename StackTraceTy>20static void TestStackTrace(StackTraceTy *trace) {21  ThreadState thr(kMainTid);22 23  ObtainCurrentStack(&thr, 0, trace);24  EXPECT_EQ(0U, trace->size);25 26  ObtainCurrentStack(&thr, 42, trace);27  EXPECT_EQ(1U, trace->size);28  EXPECT_EQ(42U, trace->trace[0]);29 30  *thr.shadow_stack_pos++ = 100;31  *thr.shadow_stack_pos++ = 101;32  ObtainCurrentStack(&thr, 0, trace);33  EXPECT_EQ(2U, trace->size);34  EXPECT_EQ(100U, trace->trace[0]);35  EXPECT_EQ(101U, trace->trace[1]);36 37  ObtainCurrentStack(&thr, 42, trace);38  EXPECT_EQ(3U, trace->size);39  EXPECT_EQ(100U, trace->trace[0]);40  EXPECT_EQ(101U, trace->trace[1]);41  EXPECT_EQ(42U, trace->trace[2]);42}43 44template<typename StackTraceTy>45static void TestTrim(StackTraceTy *trace) {46  ThreadState thr(kMainTid);47 48  for (uptr i = 0; i < 2 * kStackTraceMax; ++i)49    *thr.shadow_stack_pos++ = 100 + i;50 51  ObtainCurrentStack(&thr, 0, trace);52  EXPECT_EQ(kStackTraceMax, trace->size);53  for (uptr i = 0; i < kStackTraceMax; i++) {54    EXPECT_EQ(100 + kStackTraceMax + i, trace->trace[i]);55  }56 57  ObtainCurrentStack(&thr, 42, trace);58  EXPECT_EQ(kStackTraceMax, trace->size);59  for (uptr i = 0; i < kStackTraceMax - 1; i++) {60    EXPECT_EQ(101 + kStackTraceMax + i, trace->trace[i]);61  }62  EXPECT_EQ(42U, trace->trace[kStackTraceMax - 1]);63}64 65TEST(StackTrace, BasicVarSize) {66  VarSizeStackTrace trace;67  TestStackTrace(&trace);68}69 70TEST(StackTrace, BasicBuffered) {71  BufferedStackTrace trace;72  TestStackTrace(&trace);73}74 75TEST(StackTrace, TrimVarSize) {76  VarSizeStackTrace trace;77  TestTrim(&trace);78}79 80TEST(StackTrace, TrimBuffered) {81  BufferedStackTrace trace;82  TestTrim(&trace);83}84 85}  // namespace __tsan86