blob: f56fccbca2a7a553930806383b6ebb770f9ce4df [file] [log] [blame]
// Copyright 2014 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "syzygy/agent/asan/shadow_marker.h"
#include "gtest/gtest.h"
namespace agent {
namespace asan {
namespace {
// A list of all of the defined enumeration values.
#define EXTRACT_ENUM_NAME_MACRO(x, y) x,
static const ShadowMarker kValidShadowMarkers[] = {
SHADOW_MARKER_GENERATOR(EXTRACT_ENUM_NAME_MACRO)
};
#undef EXTRACT_ENUM_NAME_MACRO
static const ShadowMarker kRedzoneShadowMarkers[] = {
kHeapHistoricBlockStartMarker0,
kHeapHistoricBlockStartMarker1,
kHeapHistoricBlockStartMarker2,
kHeapHistoricBlockStartMarker3,
kHeapHistoricBlockStartMarker4,
kHeapHistoricBlockStartMarker5,
kHeapHistoricBlockStartMarker6,
kHeapHistoricBlockStartMarker7,
kHeapHistoricNestedBlockStartMarker0,
kHeapHistoricNestedBlockStartMarker1,
kHeapHistoricNestedBlockStartMarker2,
kHeapHistoricNestedBlockStartMarker3,
kHeapHistoricNestedBlockStartMarker4,
kHeapHistoricNestedBlockStartMarker5,
kHeapHistoricNestedBlockStartMarker6,
kHeapHistoricNestedBlockStartMarker7,
kHeapHistoricBlockEndMarker,
kHeapHistoricNestedBlockEndMarker,
kHeapHistoricLeftPaddingMarker,
kHeapHistoricRightPaddingMarker,
kHeapHistoricFreedMarker,
kHeapBlockStartMarker0,
kHeapBlockStartMarker1,
kHeapBlockStartMarker2,
kHeapBlockStartMarker3,
kHeapBlockStartMarker4,
kHeapBlockStartMarker5,
kHeapBlockStartMarker6,
kHeapBlockStartMarker7,
kHeapNestedBlockStartMarker0,
kHeapNestedBlockStartMarker1,
kHeapNestedBlockStartMarker2,
kHeapNestedBlockStartMarker3,
kHeapNestedBlockStartMarker4,
kHeapNestedBlockStartMarker5,
kHeapNestedBlockStartMarker6,
kHeapNestedBlockStartMarker7,
kAsanMemoryMarker,
kInvalidAddressMarker,
kUserRedzoneMarker,
kHeapBlockEndMarker,
kHeapNestedBlockEndMarker,
kHeapLeftPaddingMarker,
kHeapRightPaddingMarker,
kAsanReservedMarker,
kHeapFreedMarker,
};
static const ShadowMarker kActiveBlockShadowMarkers[] = {
kHeapBlockStartMarker0,
kHeapBlockStartMarker1,
kHeapBlockStartMarker2,
kHeapBlockStartMarker3,
kHeapBlockStartMarker4,
kHeapBlockStartMarker5,
kHeapBlockStartMarker6,
kHeapBlockStartMarker7,
kHeapNestedBlockStartMarker0,
kHeapNestedBlockStartMarker1,
kHeapNestedBlockStartMarker2,
kHeapNestedBlockStartMarker3,
kHeapNestedBlockStartMarker4,
kHeapNestedBlockStartMarker5,
kHeapNestedBlockStartMarker6,
kHeapNestedBlockStartMarker7,
kHeapBlockEndMarker,
kHeapNestedBlockEndMarker,
kHeapLeftPaddingMarker,
kHeapRightPaddingMarker,
kHeapFreedMarker,
};
static const ShadowMarker kHistoricBlockShadowMarkers[] = {
kHeapHistoricBlockStartMarker0,
kHeapHistoricBlockStartMarker1,
kHeapHistoricBlockStartMarker2,
kHeapHistoricBlockStartMarker3,
kHeapHistoricBlockStartMarker4,
kHeapHistoricBlockStartMarker5,
kHeapHistoricBlockStartMarker6,
kHeapHistoricBlockStartMarker7,
kHeapHistoricNestedBlockStartMarker0,
kHeapHistoricNestedBlockStartMarker1,
kHeapHistoricNestedBlockStartMarker2,
kHeapHistoricNestedBlockStartMarker3,
kHeapHistoricNestedBlockStartMarker4,
kHeapHistoricNestedBlockStartMarker5,
kHeapHistoricNestedBlockStartMarker6,
kHeapHistoricNestedBlockStartMarker7,
kHeapHistoricBlockEndMarker,
kHeapHistoricNestedBlockEndMarker,
kHeapHistoricLeftPaddingMarker,
kHeapHistoricRightPaddingMarker,
kHeapHistoricFreedMarker,
};
static const ShadowMarker kBlockShadowMarkers[] = {
kHeapHistoricBlockStartMarker0,
kHeapHistoricBlockStartMarker1,
kHeapHistoricBlockStartMarker2,
kHeapHistoricBlockStartMarker3,
kHeapHistoricBlockStartMarker4,
kHeapHistoricBlockStartMarker5,
kHeapHistoricBlockStartMarker6,
kHeapHistoricBlockStartMarker7,
kHeapHistoricNestedBlockStartMarker0,
kHeapHistoricNestedBlockStartMarker1,
kHeapHistoricNestedBlockStartMarker2,
kHeapHistoricNestedBlockStartMarker3,
kHeapHistoricNestedBlockStartMarker4,
kHeapHistoricNestedBlockStartMarker5,
kHeapHistoricNestedBlockStartMarker6,
kHeapHistoricNestedBlockStartMarker7,
kHeapHistoricBlockEndMarker,
kHeapHistoricNestedBlockEndMarker,
kHeapHistoricLeftPaddingMarker,
kHeapHistoricRightPaddingMarker,
kHeapHistoricFreedMarker,
kHeapBlockStartMarker0,
kHeapBlockStartMarker1,
kHeapBlockStartMarker2,
kHeapBlockStartMarker3,
kHeapBlockStartMarker4,
kHeapBlockStartMarker5,
kHeapBlockStartMarker6,
kHeapBlockStartMarker7,
kHeapNestedBlockStartMarker0,
kHeapNestedBlockStartMarker1,
kHeapNestedBlockStartMarker2,
kHeapNestedBlockStartMarker3,
kHeapNestedBlockStartMarker4,
kHeapNestedBlockStartMarker5,
kHeapNestedBlockStartMarker6,
kHeapNestedBlockStartMarker7,
kHeapBlockEndMarker,
kHeapNestedBlockEndMarker,
kHeapLeftPaddingMarker,
kHeapRightPaddingMarker,
kHeapFreedMarker,
};
static const ShadowMarker kActiveBlockStartShadowMarkers[] = {
kHeapBlockStartMarker0,
kHeapBlockStartMarker1,
kHeapBlockStartMarker2,
kHeapBlockStartMarker3,
kHeapBlockStartMarker4,
kHeapBlockStartMarker5,
kHeapBlockStartMarker6,
kHeapBlockStartMarker7,
kHeapNestedBlockStartMarker0,
kHeapNestedBlockStartMarker1,
kHeapNestedBlockStartMarker2,
kHeapNestedBlockStartMarker3,
kHeapNestedBlockStartMarker4,
kHeapNestedBlockStartMarker5,
kHeapNestedBlockStartMarker6,
kHeapNestedBlockStartMarker7,
};
static const ShadowMarker kHistoricBlockStartShadowMarkers[] = {
kHeapHistoricBlockStartMarker0,
kHeapHistoricBlockStartMarker1,
kHeapHistoricBlockStartMarker2,
kHeapHistoricBlockStartMarker3,
kHeapHistoricBlockStartMarker4,
kHeapHistoricBlockStartMarker5,
kHeapHistoricBlockStartMarker6,
kHeapHistoricBlockStartMarker7,
kHeapHistoricNestedBlockStartMarker0,
kHeapHistoricNestedBlockStartMarker1,
kHeapHistoricNestedBlockStartMarker2,
kHeapHistoricNestedBlockStartMarker3,
kHeapHistoricNestedBlockStartMarker4,
kHeapHistoricNestedBlockStartMarker5,
kHeapHistoricNestedBlockStartMarker6,
kHeapHistoricNestedBlockStartMarker7,
};
static const ShadowMarker kBlockStartShadowMarkers[] = {
kHeapBlockStartMarker0,
kHeapBlockStartMarker1,
kHeapBlockStartMarker2,
kHeapBlockStartMarker3,
kHeapBlockStartMarker4,
kHeapBlockStartMarker5,
kHeapBlockStartMarker6,
kHeapBlockStartMarker7,
kHeapNestedBlockStartMarker0,
kHeapNestedBlockStartMarker1,
kHeapNestedBlockStartMarker2,
kHeapNestedBlockStartMarker3,
kHeapNestedBlockStartMarker4,
kHeapNestedBlockStartMarker5,
kHeapNestedBlockStartMarker6,
kHeapNestedBlockStartMarker7,
kHeapHistoricBlockStartMarker0,
kHeapHistoricBlockStartMarker1,
kHeapHistoricBlockStartMarker2,
kHeapHistoricBlockStartMarker3,
kHeapHistoricBlockStartMarker4,
kHeapHistoricBlockStartMarker5,
kHeapHistoricBlockStartMarker6,
kHeapHistoricBlockStartMarker7,
kHeapHistoricNestedBlockStartMarker0,
kHeapHistoricNestedBlockStartMarker1,
kHeapHistoricNestedBlockStartMarker2,
kHeapHistoricNestedBlockStartMarker3,
kHeapHistoricNestedBlockStartMarker4,
kHeapHistoricNestedBlockStartMarker5,
kHeapHistoricNestedBlockStartMarker6,
kHeapHistoricNestedBlockStartMarker7,
};
static const ShadowMarker kNestedBlockStartShadowMarkers[] = {
kHeapNestedBlockStartMarker0,
kHeapNestedBlockStartMarker1,
kHeapNestedBlockStartMarker2,
kHeapNestedBlockStartMarker3,
kHeapNestedBlockStartMarker4,
kHeapNestedBlockStartMarker5,
kHeapNestedBlockStartMarker6,
kHeapNestedBlockStartMarker7,
kHeapHistoricNestedBlockStartMarker0,
kHeapHistoricNestedBlockStartMarker1,
kHeapHistoricNestedBlockStartMarker2,
kHeapHistoricNestedBlockStartMarker3,
kHeapHistoricNestedBlockStartMarker4,
kHeapHistoricNestedBlockStartMarker5,
kHeapHistoricNestedBlockStartMarker6,
kHeapHistoricNestedBlockStartMarker7,
};
static const ShadowMarker kActiveBlockEndShadowMarkers[] = {
kHeapBlockEndMarker,
kHeapNestedBlockEndMarker,
};
static const ShadowMarker kHistoricBlockEndShadowMarkers[] = {
kHeapHistoricBlockEndMarker,
kHeapHistoricNestedBlockEndMarker,
};
static const ShadowMarker kBlockEndShadowMarkers[] = {
kHeapHistoricBlockEndMarker,
kHeapHistoricNestedBlockEndMarker,
kHeapBlockEndMarker,
kHeapNestedBlockEndMarker,
};
static const ShadowMarker kNestedBlockEndShadowMarkers[] = {
kHeapHistoricNestedBlockEndMarker,
kHeapNestedBlockEndMarker,
};
static const ShadowMarker kHistoricLeftRedzoneShadowMarkers[] = {
kHeapHistoricBlockStartMarker0,
kHeapHistoricBlockStartMarker1,
kHeapHistoricBlockStartMarker2,
kHeapHistoricBlockStartMarker3,
kHeapHistoricBlockStartMarker4,
kHeapHistoricBlockStartMarker5,
kHeapHistoricBlockStartMarker6,
kHeapHistoricBlockStartMarker7,
kHeapHistoricNestedBlockStartMarker0,
kHeapHistoricNestedBlockStartMarker1,
kHeapHistoricNestedBlockStartMarker2,
kHeapHistoricNestedBlockStartMarker3,
kHeapHistoricNestedBlockStartMarker4,
kHeapHistoricNestedBlockStartMarker5,
kHeapHistoricNestedBlockStartMarker6,
kHeapHistoricNestedBlockStartMarker7,
kHeapHistoricLeftPaddingMarker,
};
static const ShadowMarker kActiveLeftRedzoneShadowMarkers[] = {
kHeapBlockStartMarker0,
kHeapBlockStartMarker1,
kHeapBlockStartMarker2,
kHeapBlockStartMarker3,
kHeapBlockStartMarker4,
kHeapBlockStartMarker5,
kHeapBlockStartMarker6,
kHeapBlockStartMarker7,
kHeapNestedBlockStartMarker0,
kHeapNestedBlockStartMarker1,
kHeapNestedBlockStartMarker2,
kHeapNestedBlockStartMarker3,
kHeapNestedBlockStartMarker4,
kHeapNestedBlockStartMarker5,
kHeapNestedBlockStartMarker6,
kHeapNestedBlockStartMarker7,
kHeapLeftPaddingMarker,
};
static const ShadowMarker kLeftRedzoneShadowMarkers[] = {
kHeapHistoricBlockStartMarker0,
kHeapHistoricBlockStartMarker1,
kHeapHistoricBlockStartMarker2,
kHeapHistoricBlockStartMarker3,
kHeapHistoricBlockStartMarker4,
kHeapHistoricBlockStartMarker5,
kHeapHistoricBlockStartMarker6,
kHeapHistoricBlockStartMarker7,
kHeapHistoricNestedBlockStartMarker0,
kHeapHistoricNestedBlockStartMarker1,
kHeapHistoricNestedBlockStartMarker2,
kHeapHistoricNestedBlockStartMarker3,
kHeapHistoricNestedBlockStartMarker4,
kHeapHistoricNestedBlockStartMarker5,
kHeapHistoricNestedBlockStartMarker6,
kHeapHistoricNestedBlockStartMarker7,
kHeapHistoricLeftPaddingMarker,
kHeapBlockStartMarker0,
kHeapBlockStartMarker1,
kHeapBlockStartMarker2,
kHeapBlockStartMarker3,
kHeapBlockStartMarker4,
kHeapBlockStartMarker5,
kHeapBlockStartMarker6,
kHeapBlockStartMarker7,
kHeapNestedBlockStartMarker0,
kHeapNestedBlockStartMarker1,
kHeapNestedBlockStartMarker2,
kHeapNestedBlockStartMarker3,
kHeapNestedBlockStartMarker4,
kHeapNestedBlockStartMarker5,
kHeapNestedBlockStartMarker6,
kHeapNestedBlockStartMarker7,
kHeapLeftPaddingMarker,
};
static const ShadowMarker kHistoricRightRedzoneShadowMarkers[] = {
kHeapHistoricBlockEndMarker,
kHeapHistoricNestedBlockEndMarker,
kHeapHistoricRightPaddingMarker,
};
static const ShadowMarker kActiveRightRedzoneShadowMarkers[] = {
kHeapBlockEndMarker,
kHeapNestedBlockEndMarker,
kHeapRightPaddingMarker,
};
static const ShadowMarker kRightRedzoneShadowMarkers[] = {
kHeapHistoricBlockEndMarker,
kHeapHistoricNestedBlockEndMarker,
kHeapHistoricRightPaddingMarker,
kHeapBlockEndMarker,
kHeapNestedBlockEndMarker,
kHeapRightPaddingMarker,
};
// Pointer to a query function.
typedef bool (*ShadowMarkerQueryFunctionPtr)(ShadowMarkerValue marker);
// Tests a shadow marker query function. Iterates over all markers defined in
// both |shadow_markers_to_test| and |passing_shadow_markers|. Expects the
// function to return true if the marker is in |passing_shadow_markers|, false
// otherwise. Markers may be defined in both lists.
//
// Meant to be called via EXPECT_NO_FATAL_FAILURES or ASSERT_NO_FATAL_FAILURES.
void TestShadowMarkerQueryFunction(
const char* function_name,
const ShadowMarker* shadow_markers_to_test,
size_t num_shadow_markers_to_test,
const ShadowMarker* passing_shadow_markers,
size_t num_passing_shadow_markers,
ShadowMarkerQueryFunctionPtr function) {
std::set<ShadowMarker> expect_fail(
shadow_markers_to_test,
shadow_markers_to_test + num_shadow_markers_to_test);
char buffer[5] = {};
for (size_t i = 0; i < num_passing_shadow_markers; ++i) {
ShadowMarker marker = passing_shadow_markers[i];
if (!(*function)(marker)) {
::_snprintf(buffer, arraysize(buffer), "0x%02X", marker);
ADD_FAILURE() << function_name << "(" << kShadowMarkerNames[marker]
<< " = " << buffer << ") returned false, expected true.";
}
expect_fail.erase(marker);
}
std::set<ShadowMarker>::const_iterator it = expect_fail.begin();
for (; it != expect_fail.end(); ++it) {
if ((*function)(*it)) {
::_snprintf(buffer, arraysize(buffer), "0x%02X", *it);
ADD_FAILURE() << function_name << "(" << kShadowMarkerNames[*it]
<< " = " << buffer << ") returned true, expected false.";
}
}
}
// A version of the function that explicitly tests against all shadow markers.
void TestShadowMarkerQueryFunction(
const char* function_name,
const ShadowMarker* passing_shadow_markers,
size_t num_passing_shadow_markers,
ShadowMarkerQueryFunctionPtr function) {
TestShadowMarkerQueryFunction(function_name,
kValidShadowMarkers,
arraysize(kValidShadowMarkers),
passing_shadow_markers,
num_passing_shadow_markers,
function);
}
} // namespace
#define TEST_SHADOW_MARKER_FUNCTION_COMPLETE(Name) \
TEST(ShadowMarkerHelperTest, Is ## Name) { \
EXPECT_NO_FATAL_FAILURE(TestShadowMarkerQueryFunction( \
"ShadowMarkerHerlp::Is" _STRINGIZE(Name), \
k ## Name ## ShadowMarkers, \
arraysize(k ## Name ## ShadowMarkers), \
&ShadowMarkerHelper::Is ## Name)); \
}
// This tests the various shadow marker querying functions.
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(Redzone);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveBlock);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricBlock);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(Block);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveBlockStart);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricBlockStart);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(BlockStart);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(NestedBlockStart);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveBlockEnd);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricBlockEnd);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(BlockEnd);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(NestedBlockEnd);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricLeftRedzone);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveLeftRedzone);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(LeftRedzone);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricRightRedzone);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveRightRedzone);
TEST_SHADOW_MARKER_FUNCTION_COMPLETE(RightRedzone);
#undef TEST_SHADOW_MARKER_FUNCTION_COMPLETE
TEST(ShadowMarkerHelperTest, GetBlockStartData) {
EXPECT_EQ(0u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricBlockStartMarker0));
EXPECT_EQ(1u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricBlockStartMarker1));
EXPECT_EQ(2u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricBlockStartMarker2));
EXPECT_EQ(3u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricBlockStartMarker3));
EXPECT_EQ(4u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricBlockStartMarker4));
EXPECT_EQ(5u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricBlockStartMarker5));
EXPECT_EQ(6u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricBlockStartMarker6));
EXPECT_EQ(7u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricBlockStartMarker7));
EXPECT_EQ(0u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricNestedBlockStartMarker0));
EXPECT_EQ(1u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricNestedBlockStartMarker1));
EXPECT_EQ(2u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricNestedBlockStartMarker2));
EXPECT_EQ(3u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricNestedBlockStartMarker3));
EXPECT_EQ(4u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricNestedBlockStartMarker4));
EXPECT_EQ(5u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricNestedBlockStartMarker5));
EXPECT_EQ(6u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricNestedBlockStartMarker6));
EXPECT_EQ(7u, ShadowMarkerHelper::GetBlockStartData(
kHeapHistoricNestedBlockStartMarker7));
EXPECT_EQ(0u, ShadowMarkerHelper::GetBlockStartData(
kHeapBlockStartMarker0));
EXPECT_EQ(1u, ShadowMarkerHelper::GetBlockStartData(
kHeapBlockStartMarker1));
EXPECT_EQ(2u, ShadowMarkerHelper::GetBlockStartData(
kHeapBlockStartMarker2));
EXPECT_EQ(3u, ShadowMarkerHelper::GetBlockStartData(
kHeapBlockStartMarker3));
EXPECT_EQ(4u, ShadowMarkerHelper::GetBlockStartData(
kHeapBlockStartMarker4));
EXPECT_EQ(5u, ShadowMarkerHelper::GetBlockStartData(
kHeapBlockStartMarker5));
EXPECT_EQ(6u, ShadowMarkerHelper::GetBlockStartData(
kHeapBlockStartMarker6));
EXPECT_EQ(7u, ShadowMarkerHelper::GetBlockStartData(
kHeapBlockStartMarker7));
EXPECT_EQ(0u, ShadowMarkerHelper::GetBlockStartData(
kHeapNestedBlockStartMarker0));
EXPECT_EQ(1u, ShadowMarkerHelper::GetBlockStartData(
kHeapNestedBlockStartMarker1));
EXPECT_EQ(2u, ShadowMarkerHelper::GetBlockStartData(
kHeapNestedBlockStartMarker2));
EXPECT_EQ(3u, ShadowMarkerHelper::GetBlockStartData(
kHeapNestedBlockStartMarker3));
EXPECT_EQ(4u, ShadowMarkerHelper::GetBlockStartData(
kHeapNestedBlockStartMarker4));
EXPECT_EQ(5u, ShadowMarkerHelper::GetBlockStartData(
kHeapNestedBlockStartMarker5));
EXPECT_EQ(6u, ShadowMarkerHelper::GetBlockStartData(
kHeapNestedBlockStartMarker6));
EXPECT_EQ(7u, ShadowMarkerHelper::GetBlockStartData(
kHeapNestedBlockStartMarker7));
}
TEST(ShadowMarkerHelper, ToHistoric) {
EXPECT_EQ(kHeapHistoricBlockStartMarker0,
ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker0));
EXPECT_EQ(kHeapHistoricBlockStartMarker1,
ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker1));
EXPECT_EQ(kHeapHistoricBlockStartMarker2,
ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker2));
EXPECT_EQ(kHeapHistoricBlockStartMarker3,
ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker3));
EXPECT_EQ(kHeapHistoricBlockStartMarker4,
ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker4));
EXPECT_EQ(kHeapHistoricBlockStartMarker5,
ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker5));
EXPECT_EQ(kHeapHistoricBlockStartMarker6,
ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker6));
EXPECT_EQ(kHeapHistoricBlockStartMarker7,
ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker7));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker0,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker0));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker1,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker1));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker2,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker2));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker3,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker3));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker4,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker4));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker5,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker5));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker6,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker6));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker7,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker7));
EXPECT_EQ(kHeapHistoricBlockEndMarker,
ShadowMarkerHelper::ToHistoric(kHeapBlockEndMarker));
EXPECT_EQ(kHeapHistoricNestedBlockEndMarker,
ShadowMarkerHelper::ToHistoric(kHeapNestedBlockEndMarker));
EXPECT_EQ(kHeapHistoricLeftPaddingMarker,
ShadowMarkerHelper::ToHistoric(kHeapLeftPaddingMarker));
EXPECT_EQ(kHeapHistoricRightPaddingMarker,
ShadowMarkerHelper::ToHistoric(kHeapRightPaddingMarker));
EXPECT_EQ(kHeapHistoricFreedMarker,
ShadowMarkerHelper::ToHistoric(kHeapFreedMarker));
}
TEST(ShadowMarkerHelper, BuildBlockStart) {
EXPECT_EQ(kHeapHistoricBlockStartMarker0,
ShadowMarkerHelper::BuildBlockStart(false, false, 0));
EXPECT_EQ(kHeapHistoricBlockStartMarker1,
ShadowMarkerHelper::BuildBlockStart(false, false, 1));
EXPECT_EQ(kHeapHistoricBlockStartMarker2,
ShadowMarkerHelper::BuildBlockStart(false, false, 2));
EXPECT_EQ(kHeapHistoricBlockStartMarker3,
ShadowMarkerHelper::BuildBlockStart(false, false, 3));
EXPECT_EQ(kHeapHistoricBlockStartMarker4,
ShadowMarkerHelper::BuildBlockStart(false, false, 4));
EXPECT_EQ(kHeapHistoricBlockStartMarker5,
ShadowMarkerHelper::BuildBlockStart(false, false, 5));
EXPECT_EQ(kHeapHistoricBlockStartMarker6,
ShadowMarkerHelper::BuildBlockStart(false, false, 6));
EXPECT_EQ(kHeapHistoricBlockStartMarker7,
ShadowMarkerHelper::BuildBlockStart(false, false, 7));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker0,
ShadowMarkerHelper::BuildBlockStart(false, true, 0));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker1,
ShadowMarkerHelper::BuildBlockStart(false, true, 1));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker2,
ShadowMarkerHelper::BuildBlockStart(false, true, 2));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker3,
ShadowMarkerHelper::BuildBlockStart(false, true, 3));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker4,
ShadowMarkerHelper::BuildBlockStart(false, true, 4));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker5,
ShadowMarkerHelper::BuildBlockStart(false, true, 5));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker6,
ShadowMarkerHelper::BuildBlockStart(false, true, 6));
EXPECT_EQ(kHeapHistoricNestedBlockStartMarker7,
ShadowMarkerHelper::BuildBlockStart(false, true, 7));
EXPECT_EQ(kHeapBlockStartMarker0,
ShadowMarkerHelper::BuildBlockStart(true, false, 0));
EXPECT_EQ(kHeapBlockStartMarker1,
ShadowMarkerHelper::BuildBlockStart(true, false, 1));
EXPECT_EQ(kHeapBlockStartMarker2,
ShadowMarkerHelper::BuildBlockStart(true, false, 2));
EXPECT_EQ(kHeapBlockStartMarker3,
ShadowMarkerHelper::BuildBlockStart(true, false, 3));
EXPECT_EQ(kHeapBlockStartMarker4,
ShadowMarkerHelper::BuildBlockStart(true, false, 4));
EXPECT_EQ(kHeapBlockStartMarker5,
ShadowMarkerHelper::BuildBlockStart(true, false, 5));
EXPECT_EQ(kHeapBlockStartMarker6,
ShadowMarkerHelper::BuildBlockStart(true, false, 6));
EXPECT_EQ(kHeapBlockStartMarker7,
ShadowMarkerHelper::BuildBlockStart(true, false, 7));
EXPECT_EQ(kHeapNestedBlockStartMarker0,
ShadowMarkerHelper::BuildBlockStart(true, true, 0));
EXPECT_EQ(kHeapNestedBlockStartMarker1,
ShadowMarkerHelper::BuildBlockStart(true, true, 1));
EXPECT_EQ(kHeapNestedBlockStartMarker2,
ShadowMarkerHelper::BuildBlockStart(true, true, 2));
EXPECT_EQ(kHeapNestedBlockStartMarker3,
ShadowMarkerHelper::BuildBlockStart(true, true, 3));
EXPECT_EQ(kHeapNestedBlockStartMarker4,
ShadowMarkerHelper::BuildBlockStart(true, true, 4));
EXPECT_EQ(kHeapNestedBlockStartMarker5,
ShadowMarkerHelper::BuildBlockStart(true, true, 5));
EXPECT_EQ(kHeapNestedBlockStartMarker6,
ShadowMarkerHelper::BuildBlockStart(true, true, 6));
EXPECT_EQ(kHeapNestedBlockStartMarker7,
ShadowMarkerHelper::BuildBlockStart(true, true, 7));
}
TEST(ShadowMarkerHelper, BuildBlockEnd) {
EXPECT_EQ(kHeapHistoricBlockEndMarker,
ShadowMarkerHelper::BuildBlockEnd(false, false));
EXPECT_EQ(kHeapHistoricNestedBlockEndMarker,
ShadowMarkerHelper::BuildBlockEnd(false, true));
EXPECT_EQ(kHeapBlockEndMarker,
ShadowMarkerHelper::BuildBlockEnd(true, false));
EXPECT_EQ(kHeapNestedBlockEndMarker,
ShadowMarkerHelper::BuildBlockEnd(true, true));
}
} // namespace asan
} // namespace agent