Home | History | Annotate | Download | only in unit
      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 
     18 namespace __tsan {
     19 
     20 static 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 
     48 TEST(StackTrace, Basic) {
     49   StackTrace trace;
     50   TestStackTrace(&trace);
     51 }
     52 
     53 TEST(StackTrace, StaticBasic) {
     54   uptr buf[10];
     55   StackTrace trace1(buf, 10);
     56   TestStackTrace(&trace1);
     57   StackTrace trace2(buf, 3);
     58   TestStackTrace(&trace2);
     59 }
     60 
     61 TEST(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