xref: /openbsd-src/gnu/llvm/compiler-rt/lib/gwp_asan/tests/basic.cpp (revision d89ec533011f513df1010f142a111086a0785f09)
13cab2bb3Spatrick //===-- basic.cpp -----------------------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick 
93cab2bb3Spatrick #include "gwp_asan/tests/harness.h"
103cab2bb3Spatrick 
TEST_F(CustomGuardedPoolAllocator,BasicAllocation)113cab2bb3Spatrick TEST_F(CustomGuardedPoolAllocator, BasicAllocation) {
123cab2bb3Spatrick   InitNumSlots(1);
133cab2bb3Spatrick   void *Ptr = GPA.allocate(1);
143cab2bb3Spatrick   EXPECT_NE(nullptr, Ptr);
153cab2bb3Spatrick   EXPECT_TRUE(GPA.pointerIsMine(Ptr));
163cab2bb3Spatrick   EXPECT_EQ(1u, GPA.getSize(Ptr));
173cab2bb3Spatrick   GPA.deallocate(Ptr);
183cab2bb3Spatrick }
193cab2bb3Spatrick 
TEST_F(DefaultGuardedPoolAllocator,NullptrIsNotMine)203cab2bb3Spatrick TEST_F(DefaultGuardedPoolAllocator, NullptrIsNotMine) {
213cab2bb3Spatrick   EXPECT_FALSE(GPA.pointerIsMine(nullptr));
223cab2bb3Spatrick }
233cab2bb3Spatrick 
TEST_F(CustomGuardedPoolAllocator,SizedAllocations)243cab2bb3Spatrick TEST_F(CustomGuardedPoolAllocator, SizedAllocations) {
253cab2bb3Spatrick   InitNumSlots(1);
263cab2bb3Spatrick 
271f9cb04fSpatrick   std::size_t MaxAllocSize = GPA.getAllocatorState()->maximumAllocationSize();
283cab2bb3Spatrick   EXPECT_TRUE(MaxAllocSize > 0);
293cab2bb3Spatrick 
303cab2bb3Spatrick   for (unsigned AllocSize = 1; AllocSize <= MaxAllocSize; AllocSize <<= 1) {
313cab2bb3Spatrick     void *Ptr = GPA.allocate(AllocSize);
323cab2bb3Spatrick     EXPECT_NE(nullptr, Ptr);
333cab2bb3Spatrick     EXPECT_TRUE(GPA.pointerIsMine(Ptr));
343cab2bb3Spatrick     EXPECT_EQ(AllocSize, GPA.getSize(Ptr));
353cab2bb3Spatrick     GPA.deallocate(Ptr);
363cab2bb3Spatrick   }
373cab2bb3Spatrick }
383cab2bb3Spatrick 
TEST_F(DefaultGuardedPoolAllocator,TooLargeAllocation)393cab2bb3Spatrick TEST_F(DefaultGuardedPoolAllocator, TooLargeAllocation) {
401f9cb04fSpatrick   EXPECT_EQ(nullptr,
411f9cb04fSpatrick             GPA.allocate(GPA.getAllocatorState()->maximumAllocationSize() + 1));
42*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(SIZE_MAX, 0));
43*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(SIZE_MAX, 1));
44*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(0, SIZE_MAX / 2));
45*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(1, SIZE_MAX / 2));
46*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(SIZE_MAX, SIZE_MAX / 2));
47*d89ec533Spatrick }
48*d89ec533Spatrick 
TEST_F(DefaultGuardedPoolAllocator,ZeroSizeAndAlignmentAllocations)49*d89ec533Spatrick TEST_F(DefaultGuardedPoolAllocator, ZeroSizeAndAlignmentAllocations) {
50*d89ec533Spatrick   void *P;
51*d89ec533Spatrick   EXPECT_NE(nullptr, (P = GPA.allocate(0, 0)));
52*d89ec533Spatrick   GPA.deallocate(P);
53*d89ec533Spatrick   EXPECT_NE(nullptr, (P = GPA.allocate(1, 0)));
54*d89ec533Spatrick   GPA.deallocate(P);
55*d89ec533Spatrick   EXPECT_NE(nullptr, (P = GPA.allocate(0, 1)));
56*d89ec533Spatrick   GPA.deallocate(P);
57*d89ec533Spatrick }
58*d89ec533Spatrick 
TEST_F(DefaultGuardedPoolAllocator,NonPowerOfTwoAlignment)59*d89ec533Spatrick TEST_F(DefaultGuardedPoolAllocator, NonPowerOfTwoAlignment) {
60*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(0, 3));
61*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(1, 3));
62*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(0, SIZE_MAX));
63*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(1, SIZE_MAX));
64*d89ec533Spatrick }
65*d89ec533Spatrick 
66*d89ec533Spatrick // Added multi-page slots? You'll need to expand this test.
TEST_F(DefaultGuardedPoolAllocator,TooBigForSinglePageSlots)67*d89ec533Spatrick TEST_F(DefaultGuardedPoolAllocator, TooBigForSinglePageSlots) {
68*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(0x1001, 0));
69*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(0x1001, 1));
70*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(0x1001, 0x1000));
71*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(1, 0x2000));
72*d89ec533Spatrick   EXPECT_EQ(nullptr, GPA.allocate(0, 0x2000));
733cab2bb3Spatrick }
743cab2bb3Spatrick 
TEST_F(CustomGuardedPoolAllocator,AllocAllSlots)753cab2bb3Spatrick TEST_F(CustomGuardedPoolAllocator, AllocAllSlots) {
763cab2bb3Spatrick   constexpr unsigned kNumSlots = 128;
773cab2bb3Spatrick   InitNumSlots(kNumSlots);
783cab2bb3Spatrick   void *Ptrs[kNumSlots];
793cab2bb3Spatrick   for (unsigned i = 0; i < kNumSlots; ++i) {
803cab2bb3Spatrick     Ptrs[i] = GPA.allocate(1);
813cab2bb3Spatrick     EXPECT_NE(nullptr, Ptrs[i]);
823cab2bb3Spatrick     EXPECT_TRUE(GPA.pointerIsMine(Ptrs[i]));
833cab2bb3Spatrick   }
843cab2bb3Spatrick 
853cab2bb3Spatrick   // This allocation should fail as all the slots are used.
863cab2bb3Spatrick   void *Ptr = GPA.allocate(1);
873cab2bb3Spatrick   EXPECT_EQ(nullptr, Ptr);
883cab2bb3Spatrick   EXPECT_FALSE(GPA.pointerIsMine(nullptr));
893cab2bb3Spatrick 
903cab2bb3Spatrick   for (unsigned i = 0; i < kNumSlots; ++i)
913cab2bb3Spatrick     GPA.deallocate(Ptrs[i]);
923cab2bb3Spatrick }
93