memory_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define _CRT_SECURE_NO_WARNINGS 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/process/memory.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <limits> 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/compiler_specific.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/debug/alias.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/stringprintf.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <windows.h> 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_POSIX) 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <errno.h> 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_MACOSX) 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <malloc/malloc.h> 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/process/memory_unittest_mac.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_LINUX) 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <malloc.h> 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// HeapQueryInformation function pointer. 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef BOOL (WINAPI* HeapQueryFn) \ 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T); 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst int kConstantInModule = 42; 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(ProcessMemoryTest, GetModuleFromAddress) { 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Since the unit tests are their own EXE, this should be 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // equivalent to the EXE's HINSTANCE. 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // kConstantInModule is a constant in this file and 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // therefore within the unit test EXE. 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(::GetModuleHandle(NULL), 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::GetModuleFromAddress( 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const_cast<int*>(&kConstantInModule))); 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Any address within the kernel32 module should return 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // kernel32's HMODULE. Our only assumption here is that 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // kernel32 is larger than 4 bytes. 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HMODULE kernel32 = ::GetModuleHandle(L"kernel32.dll"); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HMODULE kernel32_from_address = 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::GetModuleFromAddress(reinterpret_cast<DWORD*>(kernel32) + 1); 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(kernel32, kernel32_from_address); 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(ProcessMemoryTest, EnableLFH) { 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(base::EnableLowFragmentationHeap()); 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsDebuggerPresent()) { 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Under these conditions, LFH can't be enabled. There's no point to test 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // anything. 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* no_debug_env = getenv("_NO_DEBUG_HEAP"); 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!no_debug_env || strcmp(no_debug_env, "1")) 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HMODULE kernel32 = GetModuleHandle(L"kernel32.dll"); 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(kernel32 != NULL); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HeapQueryFn heap_query = reinterpret_cast<HeapQueryFn>(GetProcAddress( 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kernel32, 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "HeapQueryInformation")); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // On Windows 2000, the function is not exported. This is not a reason to 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // fail but we won't be able to retrieves information about the heap, so we 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // should stop here. 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (heap_query == NULL) 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HANDLE heaps[1024] = { 0 }; 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unsigned number_heaps = GetProcessHeaps(1024, heaps); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_GT(number_heaps, 0u); 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (unsigned i = 0; i < number_heaps; ++i) { 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ULONG flag = 0; 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SIZE_T length; 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_NE(0, heap_query(heaps[i], 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HeapCompatibilityInformation, 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &flag, 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch sizeof(flag), 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &length)); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If flag is 0, the heap is a standard heap that does not support 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // look-asides. If flag is 1, the heap supports look-asides. If flag is 2, 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the heap is a low-fragmentation heap (LFH). Note that look-asides are not 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // supported on the LFH. 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // We don't have any documented way of querying the HEAP_NO_SERIALIZE flag. 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_LE(flag, 2u); 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE(flag, 1u); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(OS_WIN) 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_MACOSX) 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// For the following Mac tests: 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Note that base::EnableTerminationOnHeapCorruption() is called as part of 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// test suite setup and does not need to be done again, else mach_override 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// will fail. 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(ADDRESS_SANITIZER) 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The following code tests the system implementation of malloc() thus no need 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// to test it under AddressSanitizer. 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(ProcessMemoryTest, MacMallocFailureDoesNotTerminate) { 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Test that ENOMEM doesn't crash via CrMallocErrorBreak two ways: the exit 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // code and lack of the error string. The number of bytes is one less than 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // MALLOC_ABSOLUTE_MAX_SIZE, more than which the system early-returns NULL and 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // does not call through malloc_error_break(). See the comment at 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // EnableTerminationOnOutOfMemory() for more information. 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void* buf = NULL; 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EXIT( 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::EnableTerminationOnOutOfMemory(); 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buf = malloc(std::numeric_limits<size_t>::max() - (2 * PAGE_SIZE) - 1); 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch testing::KilledBySignal(SIGTRAP), 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\\*\\*\\* error: can't allocate region.*\\n?.*"); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::debug::Alias(buf); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // !defined(ADDRESS_SANITIZER) 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(ProcessMemoryTest, MacTerminateOnHeapCorruption) { 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Assert that freeing an unallocated pointer will crash the process. 132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch char buf[9]; 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch asm("" : "=r" (buf)); // Prevent clang from being too smart. 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if ARCH_CPU_64_BITS 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // On 64 bit Macs, the malloc system automatically abort()s on heap corruption 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // but does not output anything. 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH(free(buf), ""); 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#elif defined(ADDRESS_SANITIZER) 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // AddressSanitizer replaces malloc() and prints a different error message on 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // heap corruption. 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH(free(buf), "attempting free on address which " 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "was not malloc\\(\\)-ed"); 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_DEATH(free(buf), "being freed.*\\n?\\.*" 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\\*\\*\\* set a breakpoint in malloc_error_break to debug.*\\n?.*" 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "Terminating process due to a potential for future heap corruption"); 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // ARCH_CPU_64_BITS || defined(ADDRESS_SANITIZER) 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(OS_MACOSX) 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Android doesn't implement set_new_handler, so we can't use the 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// OutOfMemoryTest cases. 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// OpenBSD does not support these tests either. 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// AddressSanitizer and ThreadSanitizer define the malloc()/free()/etc. 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// functions so that they don't crash if the program is out of memory, so the 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// OOM tests aren't supposed to work. 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// TODO(vandebo) make this work on Windows too. 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_ANDROID) && !defined(OS_OPENBSD) && \ 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !defined(OS_WIN) && \ 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !defined(ADDRESS_SANITIZER) && !defined(THREAD_SANITIZER) 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_TCMALLOC) 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochextern "C" { 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint tc_set_new_mode(int mode); 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(USE_TCMALLOC) 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass OutOfMemoryDeathTest : public testing::Test { 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OutOfMemoryDeathTest() 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : value_(NULL), 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Make test size as large as possible minus a few pages so 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // that alignment or other rounding doesn't make it wrap. 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_size_(std::numeric_limits<std::size_t>::max() - 12 * 1024), 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch signed_test_size_(std::numeric_limits<ssize_t>::max()) { 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_TCMALLOC) 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetUp() OVERRIDE { 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tc_set_new_mode(1); 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void TearDown() OVERRIDE { 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tc_set_new_mode(0); 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(USE_TCMALLOC) 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetUpInDeathAssert() { 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Must call EnableTerminationOnOutOfMemory() because that is called from 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // chrome's main function and therefore hasn't been called yet. 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Since this call may result in another thread being created and death 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // tests shouldn't be started in a multithread environment, this call 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // should be done inside of the ASSERT_DEATH. 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::EnableTerminationOnOutOfMemory(); 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void* value_; 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t test_size_; 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ssize_t signed_test_size_; 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, New) { 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = operator new(test_size_); 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, NewArray) { 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = new char[test_size_]; 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, Malloc) { 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = malloc(test_size_); 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, Realloc) { 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = realloc(NULL, test_size_); 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, Calloc) { 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = calloc(1024, test_size_ / 1024L); 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, Valloc) { 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = valloc(test_size_); 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_LINUX) 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, Pvalloc) { 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = pvalloc(test_size_); 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, Memalign) { 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = memalign(4, test_size_); 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, ViaSharedLibraries) { 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This tests that the run-time symbol resolution is overriding malloc for 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // shared libraries (including libc itself) as well as for our code. 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string format = base::StringPrintf("%%%zud", test_size_); 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) char *value = NULL; 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(-1, asprintf(&value, format.c_str(), 0)); 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // OS_LINUX 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Android doesn't implement posix_memalign(). 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_POSIX) && !defined(OS_ANDROID) 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, Posix_memalign) { 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Grab the return value of posix_memalign to silence a compiler warning 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // about unused return values. We don't actually care about the return 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // value, since we're asserting death. 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(ENOMEM, posix_memalign(&value_, 8, test_size_)); 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(OS_POSIX) && !defined(OS_ANDROID) 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_MACOSX) 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Purgeable zone tests 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, MallocPurgeable) { 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch malloc_zone_t* zone = malloc_default_purgeable_zone(); 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = malloc_zone_malloc(zone, test_size_); 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, ReallocPurgeable) { 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch malloc_zone_t* zone = malloc_default_purgeable_zone(); 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = malloc_zone_realloc(zone, NULL, test_size_); 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, CallocPurgeable) { 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch malloc_zone_t* zone = malloc_default_purgeable_zone(); 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = malloc_zone_calloc(zone, 1024, test_size_ / 1024L); 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, VallocPurgeable) { 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch malloc_zone_t* zone = malloc_default_purgeable_zone(); 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = malloc_zone_valloc(zone, test_size_); 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, PosixMemalignPurgeable) { 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch malloc_zone_t* zone = malloc_default_purgeable_zone(); 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value_ = malloc_zone_memalign(zone, 8, test_size_); 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Since these allocation functions take a signed size, it's possible that 330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// calling them just once won't be enough to exhaust memory. In the 32-bit 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// environment, it's likely that these allocation attempts will fail because 332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// not enough contiguous address space is available. In the 64-bit environment, 333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// it's likely that they'll fail because they would require a preposterous 334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// amount of (virtual) memory. 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, CFAllocatorSystemDefault) { 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while ((value_ = 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::AllocateViaCFAllocatorSystemDefault(signed_test_size_))) {} 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, CFAllocatorMalloc) { 345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while ((value_ = 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::AllocateViaCFAllocatorMalloc(signed_test_size_))) {} 349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, CFAllocatorMallocZone) { 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while ((value_ = 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::AllocateViaCFAllocatorMallocZone(signed_test_size_))) {} 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(ARCH_CPU_64_BITS) 361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// See process_util_unittest_mac.mm for an explanation of why this test isn't 363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// run in the 64-bit environment. 364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(OutOfMemoryDeathTest, PsychoticallyBigObjCObject) { 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_DEATH({ 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpInDeathAssert(); 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while ((value_ = base::AllocatePsychoticallyBigObjCObject())) {} 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, ""); 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // !ARCH_CPU_64_BITS 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // OS_MACOSX 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // !defined(OS_ANDROID) && !defined(OS_OPENBSD) && 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // !defined(OS_WIN) && !defined(ADDRESS_SANITIZER) 377