//===-- sanitizer_stacktrace_test.cpp -------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file is a part of ThreadSanitizer/AddressSanitizer runtime.
//
//===----------------------------------------------------------------------===//

#include "sanitizer_common/sanitizer_stacktrace.h"

#include <string.h>

#include <algorithm>
#include <string>

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_internal_defs.h"

using testing::ContainsRegex;
using testing::MatchesRegex;

namespace __sanitizer {

class FastUnwindTest : public ::testing::Test {
 protected:
  virtual void SetUp();
  virtual void TearDown();

  void UnwindFast();

  void *mapping;
  uhwptr *fake_stack;
  const uptr fake_stack_size = 10;
  uhwptr start_pc;

  uhwptr fake_bp;
  uhwptr fake_top;
  uhwptr fake_bottom;
  BufferedStackTrace trace;

#if defined(__loongarch__) || defined(__riscv)
  const uptr kFpOffset = 4;
  const uptr kBpOffset = 2;
#else
  const uptr kFpOffset = 2;
  const uptr kBpOffset = 0;
#endif

 private:
  CommonFlags tmp_flags_;
};

static uptr PC(uptr idx) {
  return (1<<20) + idx;
}

void FastUnwindTest::SetUp() {
  size_t ps = GetPageSize();
  mapping = MmapOrDie(2 * ps, "FastUnwindTest");
  MprotectNoAccess((uptr)mapping, ps);

  // Unwinder may peek 1 word down from the starting FP.
  fake_stack = (uhwptr *)((uptr)mapping + ps + sizeof(uhwptr));

  // Fill an array of pointers with fake fp+retaddr pairs.  Frame pointers have
  // even indices.
  for (uptr i = 0; i + 1 < fake_stack_size; i += 2) {
    fake_stack[i] = (uptr)&fake_stack[i + kFpOffset];  // fp
    fake_stack[i+1] = PC(i + 1); // retaddr
  }
  // Mark the last fp point back up to terminate the stack trace.
  fake_stack[RoundDownTo(fake_stack_size - 1, 2)] = (uhwptr)&fake_stack[0];

  // Top is two slots past the end because UnwindFast subtracts two.
  fake_top = (uhwptr)&fake_stack[fake_stack_size + kFpOffset];
  // Bottom is one slot before the start because UnwindFast uses >.
  fake_bottom = (uhwptr)mapping;
  fake_bp = (uptr)&fake_stack[kBpOffset];
  start_pc = PC(0);

  tmp_flags_.CopyFrom(*common_flags());
}

void FastUnwindTest::TearDown() {
  size_t ps = GetPageSize();
  UnmapOrDie(mapping, 2 * ps);

  // Restore default flags.
  OverrideCommonFlags(tmp_flags_);
}

#if SANITIZER_CAN_FAST_UNWIND

#ifdef __sparc__
// Fake stacks don't meet SPARC UnwindFast requirements.
#define SKIP_ON_SPARC(x) DISABLED_##x
#else
#define SKIP_ON_SPARC(x) x
#endif

void FastUnwindTest::UnwindFast() {
  trace.UnwindFast(start_pc, fake_bp, fake_top, fake_bottom, kStackTraceMax);
}

TEST_F(FastUnwindTest, SKIP_ON_SPARC(Basic)) {
  UnwindFast();
  // Should get all on-stack retaddrs and start_pc.
  EXPECT_EQ(6U, trace.size);
  EXPECT_EQ(start_pc, trace.trace[0]);
  for (uptr i = 1; i <= 5; i++) {
    EXPECT_EQ(PC(i*2 - 1), trace.trace[i]);
  }
}

// From: https://github.com/google/sanitizers/issues/162
TEST_F(FastUnwindTest, SKIP_ON_SPARC(FramePointerLoop)) {
  // Make one fp point to itself.
  fake_stack[4] = (uhwptr)&fake_stack[4];
  UnwindFast();
  // Should get all on-stack retaddrs up to the 4th slot and start_pc.
  EXPECT_EQ(4U, trace.size);
  EXPECT_EQ(start_pc, trace.trace[0]);
  for (uptr i = 1; i <= 3; i++) {
    EXPECT_EQ(PC(i*2 - 1), trace.trace[i]);
  }
}

TEST_F(FastUnwindTest, SKIP_ON_SPARC(MisalignedFramePointer)) {
  // Make one fp misaligned.
  fake_stack[4] += 3;
  UnwindFast();
  // Should get all on-stack retaddrs up to the 4th slot and start_pc.
  EXPECT_EQ(4U, trace.size);
  EXPECT_EQ(start_pc, trace.trace[0]);
  for (uptr i = 1; i < 4U; i++) {
    EXPECT_EQ(PC(i*2 - 1), trace.trace[i]);
  }
}

TEST_F(FastUnwindTest, OneFrameStackTrace) {
  trace.Unwind(start_pc, fake_bp, nullptr, true, 1);
  EXPECT_EQ(1U, trace.size);
  EXPECT_EQ(start_pc, trace.trace[0]);
  EXPECT_EQ((uhwptr)&fake_stack[kBpOffset], trace.top_frame_bp);
}

TEST_F(FastUnwindTest, ZeroFramesStackTrace) {
  trace.Unwind(start_pc, fake_bp, nullptr, true, 0);
  EXPECT_EQ(0U, trace.size);
  EXPECT_EQ(0U, trace.top_frame_bp);
}

TEST_F(FastUnwindTest, SKIP_ON_SPARC(FPBelowPrevFP)) {
  // The next FP points to unreadable memory inside the stack limits, but below
  // current FP.
  fake_stack[0] = (uhwptr)&fake_stack[-50];
  fake_stack[1] = PC(1);
  UnwindFast();
  EXPECT_EQ(2U, trace.size);
  EXPECT_EQ(PC(0), trace.trace[0]);
  EXPECT_EQ(PC(1), trace.trace[1]);
}

TEST_F(FastUnwindTest, SKIP_ON_SPARC(CloseToZeroFrame)) {
  // Make one pc a NULL pointer.
  fake_stack[5] = 0x0;
  UnwindFast();
  // The stack should be truncated at the NULL pointer (and not include it).
  EXPECT_EQ(3U, trace.size);
  EXPECT_EQ(start_pc, trace.trace[0]);
  for (uptr i = 1; i < 3U; i++) {
    EXPECT_EQ(PC(i*2 - 1), trace.trace[i]);
  }
}

using StackPrintTest = FastUnwindTest;

TEST_F(StackPrintTest, SKIP_ON_SPARC(ContainsFullTrace)) {
  // Override stack trace format to make testing code independent of default
  // flag values.
  CommonFlags flags;
  flags.CopyFrom(*common_flags());
  flags.stack_trace_format = "#%n %p";
  OverrideCommonFlags(flags);

  UnwindFast();

  char buf[3000];
  trace.PrintTo(buf, sizeof(buf));
  EXPECT_THAT(std::string(buf),
              MatchesRegex("(#[0-9]+ 0x[0-9a-f]+\n){" +
                           std::to_string(trace.size) + "}\n"));
}

TEST_F(StackPrintTest, SKIP_ON_SPARC(TruncatesContents)) {
  UnwindFast();

  char buf[3000];
  uptr actual_len = trace.PrintTo(buf, sizeof(buf));
  ASSERT_LT(actual_len, sizeof(buf));

  char tinybuf[10];
  trace.PrintTo(tinybuf, sizeof(tinybuf));

  // This the the truncation case.
  ASSERT_GT(actual_len, sizeof(tinybuf));

  // The truncated contents should be a prefix of the full contents.
  size_t lastpos = sizeof(tinybuf) - 1;
  EXPECT_EQ(strncmp(buf, tinybuf, lastpos), 0);
  EXPECT_EQ(tinybuf[lastpos], '\0');

  // Full bufffer has more contents...
  EXPECT_NE(buf[lastpos], '\0');
}

TEST_F(StackPrintTest, SKIP_ON_SPARC(WorksWithEmptyStack)) {
  char buf[3000];
  trace.PrintTo(buf, sizeof(buf));
  EXPECT_NE(strstr(buf, "<empty stack>"), nullptr);
}

TEST_F(StackPrintTest, SKIP_ON_SPARC(ReturnsCorrectLength)) {
  UnwindFast();

  char buf[3000];
  uptr len = trace.PrintTo(buf, sizeof(buf));
  size_t actual_len = strlen(buf);
  ASSERT_LT(len, sizeof(buf));
  EXPECT_EQ(len, actual_len);

  char tinybuf[5];
  len = trace.PrintTo(tinybuf, sizeof(tinybuf));
  size_t truncated_len = strlen(tinybuf);
  ASSERT_GE(len, sizeof(tinybuf));
  EXPECT_EQ(len, actual_len);
  EXPECT_EQ(truncated_len, sizeof(tinybuf) - 1);
}

TEST_F(StackPrintTest, SKIP_ON_SPARC(AcceptsZeroSize)) {
  UnwindFast();
  char buf[1];
  EXPECT_GT(trace.PrintTo(buf, 0), 0u);
}

using StackPrintDeathTest = StackPrintTest;

TEST_F(StackPrintDeathTest, SKIP_ON_SPARC(RequiresNonNullBuffer)) {
  UnwindFast();
  EXPECT_DEATH(trace.PrintTo(NULL, 100), "");
}

#endif // SANITIZER_CAN_FAST_UNWIND

TEST(SlowUnwindTest, ShortStackTrace) {
  BufferedStackTrace stack;
  uptr pc = StackTrace::GetCurrentPc();
  uptr bp = GET_CURRENT_FRAME();
  stack.Unwind(pc, bp, nullptr, false, /*max_depth=*/0);
  EXPECT_EQ(0U, stack.size);
  EXPECT_EQ(0U, stack.top_frame_bp);
  stack.Unwind(pc, bp, nullptr, false, /*max_depth=*/1);
  EXPECT_EQ(1U, stack.size);
  EXPECT_EQ(pc, stack.trace[0]);
  EXPECT_EQ(bp, stack.top_frame_bp);
}

TEST(GetCurrentPc, Basic) {
  // Test that PCs obtained via GET_CURRENT_PC()
  // and StackTrace::GetCurrentPc() are all different
  // and are close to the function start.
  struct Local {
    static NOINLINE void Test() {
      const uptr pcs[] = {
          (uptr)&Local::Test,
          GET_CURRENT_PC(),
          StackTrace::GetCurrentPc(),
          StackTrace::GetCurrentPc(),
      };
      for (uptr i = 0; i < ARRAY_SIZE(pcs); i++)
        Printf("pc%zu: 0x%zx\n", i, pcs[i]);
      for (uptr i = 1; i < ARRAY_SIZE(pcs); i++) {
        EXPECT_GT(pcs[i], pcs[0]);
        EXPECT_LT(pcs[i], pcs[0] + 1000);
        for (uptr j = 0; j < i; j++) EXPECT_NE(pcs[i], pcs[j]);
      }
    }
  };
  Local::Test();
}

// Dummy implementation. This should never be called, but is required to link
// non-optimized builds of this test.
void BufferedStackTrace::UnwindImpl(uptr pc, uptr bp, void *context,
                                    bool request_fast, u32 max_depth) {
  UNIMPLEMENTED();
}

}  // namespace __sanitizer
