1//===-- iterate.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 <algorithm> 12#include <set> 13#include <vector> 14 15TEST_F(CustomGuardedPoolAllocator, Iterate) { 16 InitNumSlots(7); 17 std::vector<std::pair<void *, size_t>> Allocated; 18 auto alloc = [&](size_t size) { 19 Allocated.push_back({GPA.allocate(size), size}); 20 }; 21 22 void *Ptr = GPA.allocate(5); 23 alloc(2); 24 alloc(1); 25 alloc(100); 26 GPA.deallocate(Ptr); 27 alloc(42); 28 std::sort(Allocated.begin(), Allocated.end()); 29 30 GPA.disable(); 31 void *Base = Allocated[0].first; 32 size_t Size = reinterpret_cast<size_t>(Allocated.back().first) - 33 reinterpret_cast<size_t>(Base) + 1; 34 std::vector<std::pair<void *, size_t>> Found; 35 GPA.iterate( 36 Base, Size, 37 [](uintptr_t Addr, size_t Size, void *Arg) { 38 reinterpret_cast<std::vector<std::pair<void *, size_t>> *>(Arg) 39 ->push_back({(void *)Addr, Size}); 40 }, 41 reinterpret_cast<void *>(&Found)); 42 GPA.enable(); 43 44 std::sort(Found.begin(), Found.end()); 45 EXPECT_EQ(Allocated, Found); 46 47 // Now without the last allocation. 48 GPA.disable(); 49 Size = reinterpret_cast<size_t>(Allocated.back().first) - 50 reinterpret_cast<size_t>(Base); // Allocated.back() is out of range. 51 Found.clear(); 52 GPA.iterate( 53 Base, Size, 54 [](uintptr_t Addr, size_t Size, void *Arg) { 55 reinterpret_cast<std::vector<std::pair<void *, size_t>> *>(Arg) 56 ->push_back({(void *)Addr, Size}); 57 }, 58 reinterpret_cast<void *>(&Found)); 59 GPA.enable(); 60 61 // We should have found every allocation but the last. 62 // Remove it and compare the rest. 63 std::sort(Found.begin(), Found.end()); 64 GPA.deallocate(Allocated.back().first); 65 Allocated.pop_back(); 66 EXPECT_EQ(Allocated, Found); 67 68 for (auto PS : Allocated) 69 GPA.deallocate(PS.first); 70} 71