1 //===-- map_test.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 "common.h" 10 11 #include "gtest/gtest.h" 12 13 #include <string.h> 14 #include <unistd.h> 15 16 static const char *MappingName = "scudo:test"; 17 18 TEST(ScudoMapTest, PageSize) { 19 EXPECT_EQ(scudo::getPageSizeCached(), 20 static_cast<scudo::uptr>(getpagesize())); 21 } 22 23 TEST(ScudoMapTest, MapNoAccessUnmap) { 24 const scudo::uptr Size = 4 * scudo::getPageSizeCached(); 25 scudo::MapPlatformData Data = {}; 26 void *P = scudo::map(nullptr, Size, MappingName, MAP_NOACCESS, &Data); 27 EXPECT_NE(P, nullptr); 28 EXPECT_DEATH(memset(P, 0xaa, Size), ""); 29 scudo::unmap(P, Size, UNMAP_ALL, &Data); 30 } 31 32 TEST(ScudoMapTest, MapUnmap) { 33 const scudo::uptr Size = 4 * scudo::getPageSizeCached(); 34 scudo::MapPlatformData Data = {}; 35 void *P = scudo::map(nullptr, Size, MappingName, 0, &Data); 36 EXPECT_NE(P, nullptr); 37 memset(P, 0xaa, Size); 38 scudo::unmap(P, Size, 0, &Data); 39 EXPECT_DEATH(memset(P, 0xbb, Size), ""); 40 } 41 42 TEST(ScudoMapTest, MapWithGuardUnmap) { 43 const scudo::uptr PageSize = scudo::getPageSizeCached(); 44 const scudo::uptr Size = 4 * PageSize; 45 scudo::MapPlatformData Data = {}; 46 void *P = scudo::map(nullptr, Size + 2 * PageSize, MappingName, MAP_NOACCESS, 47 &Data); 48 EXPECT_NE(P, nullptr); 49 void *Q = 50 reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(P) + PageSize); 51 EXPECT_EQ(scudo::map(Q, Size, MappingName, 0, &Data), Q); 52 memset(Q, 0xaa, Size); 53 EXPECT_DEATH(memset(Q, 0xaa, Size + 1), ""); 54 scudo::unmap(P, Size + 2 * PageSize, UNMAP_ALL, &Data); 55 } 56 57 TEST(ScudoMapTest, MapGrowUnmap) { 58 const scudo::uptr PageSize = scudo::getPageSizeCached(); 59 const scudo::uptr Size = 4 * PageSize; 60 scudo::MapPlatformData Data = {}; 61 void *P = scudo::map(nullptr, Size, MappingName, MAP_NOACCESS, &Data); 62 EXPECT_NE(P, nullptr); 63 void *Q = 64 reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(P) + PageSize); 65 EXPECT_EQ(scudo::map(Q, PageSize, MappingName, 0, &Data), Q); 66 memset(Q, 0xaa, PageSize); 67 Q = reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(Q) + PageSize); 68 EXPECT_EQ(scudo::map(Q, PageSize, MappingName, 0, &Data), Q); 69 memset(Q, 0xbb, PageSize); 70 scudo::unmap(P, Size, UNMAP_ALL, &Data); 71 } 72