|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #define _CRT_SECURE_NO_WARNINGS | 
|  |  | 
|  | #include "base/process/memory.h" | 
|  |  | 
|  | #include <stddef.h> | 
|  |  | 
|  | #include <limits> | 
|  |  | 
|  | #include "base/allocator/allocator_check.h" | 
|  | #include "base/compiler_specific.h" | 
|  | #include "base/debug/alias.h" | 
|  | #include "base/memory/aligned_memory.h" | 
|  | #include "base/strings/stringprintf.h" | 
|  | #include "build/build_config.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | #include <windows.h> | 
|  | #endif | 
|  | #if defined(OS_POSIX) | 
|  | #include <errno.h> | 
|  | #endif | 
|  | #if defined(OS_MACOSX) | 
|  | #include <malloc/malloc.h> | 
|  | #include "base/allocator/allocator_interception_mac.h" | 
|  | #include "base/allocator/allocator_shim.h" | 
|  | #include "base/process/memory_unittest_mac.h" | 
|  | #endif | 
|  | #if defined(OS_LINUX) | 
|  | #include <malloc.h> | 
|  | #include "base/test/malloc_wrapper.h" | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  |  | 
|  | #if defined(COMPILER_MSVC) | 
|  | // ssize_t needed for OutOfMemoryTest. | 
|  | #if defined(_WIN64) | 
|  | typedef __int64 ssize_t; | 
|  | #else | 
|  | typedef long ssize_t; | 
|  | #endif | 
|  | #endif | 
|  |  | 
|  | // HeapQueryInformation function pointer. | 
|  | typedef BOOL (WINAPI* HeapQueryFn)  \ | 
|  | (HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T); | 
|  |  | 
|  | #endif  // defined(OS_WIN) | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  |  | 
|  | // For the following Mac tests: | 
|  | // Note that base::EnableTerminationOnHeapCorruption() is called as part of | 
|  | // test suite setup and does not need to be done again, else mach_override | 
|  | // will fail. | 
|  |  | 
|  | TEST(ProcessMemoryTest, MacTerminateOnHeapCorruption) { | 
|  | // Assert that freeing an unallocated pointer will crash the process. | 
|  | char buf[9]; | 
|  | asm("" : "=r" (buf));  // Prevent clang from being too smart. | 
|  | #if ARCH_CPU_64_BITS | 
|  | // On 64 bit Macs, the malloc system automatically abort()s on heap corruption | 
|  | // but does not output anything. | 
|  | ASSERT_DEATH(free(buf), ""); | 
|  | #elif defined(ADDRESS_SANITIZER) | 
|  | // AddressSanitizer replaces malloc() and prints a different error message on | 
|  | // heap corruption. | 
|  | ASSERT_DEATH(free(buf), "attempting free on address which " | 
|  | "was not malloc\\(\\)-ed"); | 
|  | #else | 
|  | ADD_FAILURE() << "This test is not supported in this build configuration."; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | #endif  // defined(OS_MACOSX) | 
|  |  | 
|  | TEST(MemoryTest, AllocatorShimWorking) { | 
|  | #if defined(OS_MACOSX) | 
|  | base::allocator::InterceptAllocationsMac(); | 
|  | #endif | 
|  | ASSERT_TRUE(base::allocator::IsAllocatorInitialized()); | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | base::allocator::UninterceptMallocZonesForTesting(); | 
|  | #endif | 
|  | } |