xref: /aosp_15_r20/external/gwp_asan/gwp_asan/tests/harness.cpp (revision b302aa5039729da396909ef03e815160dab4448c)
1 //===-- harness.cpp ---------------------------------------------*- C++ -*-===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "gwp_asan/tests/harness.h"
10 
11 #include <string>
12 
13 // Optnone to ensure that the calls to these functions are not optimized away,
14 // as we're looking for them in the backtraces.
15 __attribute__((optnone)) char *
AllocateMemory(gwp_asan::GuardedPoolAllocator & GPA)16 AllocateMemory(gwp_asan::GuardedPoolAllocator &GPA) {
17   return static_cast<char *>(GPA.allocate(1));
18 }
19 __attribute__((optnone)) void
DeallocateMemory(gwp_asan::GuardedPoolAllocator & GPA,void * Ptr)20 DeallocateMemory(gwp_asan::GuardedPoolAllocator &GPA, void *Ptr) {
21   GPA.deallocate(Ptr);
22 }
23 __attribute__((optnone)) void
DeallocateMemory2(gwp_asan::GuardedPoolAllocator & GPA,void * Ptr)24 DeallocateMemory2(gwp_asan::GuardedPoolAllocator &GPA, void *Ptr) {
25   GPA.deallocate(Ptr);
26 }
TouchMemory(void * Ptr)27 __attribute__((optnone)) void TouchMemory(void *Ptr) {
28   *(reinterpret_cast<volatile char *>(Ptr)) = 7;
29 }
30 
CheckOnlyOneGwpAsanCrash(const std::string & OutputBuffer)31 void CheckOnlyOneGwpAsanCrash(const std::string &OutputBuffer) {
32   const char *kGwpAsanErrorString = "GWP-ASan detected a memory error";
33   size_t FirstIndex = OutputBuffer.find(kGwpAsanErrorString);
34   ASSERT_NE(FirstIndex, std::string::npos) << "Didn't detect a GWP-ASan crash";
35   ASSERT_EQ(OutputBuffer.find(kGwpAsanErrorString, FirstIndex + 1),
36             std::string::npos)
37       << "Detected more than one GWP-ASan crash:\n"
38       << OutputBuffer;
39 }
40 
41 // Fuchsia does not support recoverable GWP-ASan.
42 #if defined(__Fuchsia__)
43 INSTANTIATE_TEST_SUITE_P(RecoverableAndNonRecoverableTests,
44                          BacktraceGuardedPoolAllocatorDeathTest,
45                          /* Recoverable */ testing::Values(false));
46 #else
47 INSTANTIATE_TEST_SUITE_P(RecoverableTests, BacktraceGuardedPoolAllocator,
48                          /* Recoverable */ testing::Values(true));
49 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BacktraceGuardedPoolAllocator);
50 INSTANTIATE_TEST_SUITE_P(RecoverableAndNonRecoverableTests,
51                          BacktraceGuardedPoolAllocatorDeathTest,
52                          /* Recoverable */ testing::Bool());
53 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BacktraceGuardedPoolAllocatorDeathTest);
54 #endif
55