malloc_test.cpp revision 5ee320dd35fafc11eaf90c62198e08c6670e35b4
1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <gtest/gtest.h> 18 19#include <limits.h> 20#include <stdint.h> 21#include <stdlib.h> 22#include <malloc.h> 23#include <unistd.h> 24 25#if defined(__BIONIC__) 26#include <libc/bionic/malloc_debug_common.h> 27#endif 28 29TEST(malloc, malloc_std) { 30 // Simple malloc test. 31 void *ptr = malloc(100); 32 ASSERT_TRUE(ptr != NULL); 33 ASSERT_LE(100U, malloc_usable_size(ptr)); 34 free(ptr); 35} 36 37TEST(malloc, malloc_overflow) { 38 errno = 0; 39 ASSERT_EQ(NULL, malloc(SIZE_MAX)); 40 ASSERT_EQ(ENOMEM, errno); 41} 42 43TEST(malloc, calloc_std) { 44 // Simple calloc test. 45 size_t alloc_len = 100; 46 char *ptr = (char *)calloc(1, alloc_len); 47 ASSERT_TRUE(ptr != NULL); 48 ASSERT_LE(alloc_len, malloc_usable_size(ptr)); 49 for (size_t i = 0; i < alloc_len; i++) { 50 ASSERT_EQ(0, ptr[i]); 51 } 52 free(ptr); 53} 54 55TEST(malloc, calloc_illegal) { 56 errno = 0; 57 ASSERT_EQ(NULL, calloc(-1, 100)); 58 ASSERT_EQ(ENOMEM, errno); 59} 60 61TEST(malloc, calloc_overflow) { 62 errno = 0; 63 ASSERT_EQ(NULL, calloc(1, SIZE_MAX)); 64 ASSERT_EQ(ENOMEM, errno); 65 errno = 0; 66 ASSERT_EQ(NULL, calloc(SIZE_MAX, SIZE_MAX)); 67 ASSERT_EQ(ENOMEM, errno); 68 errno = 0; 69 ASSERT_EQ(NULL, calloc(2, SIZE_MAX)); 70 ASSERT_EQ(ENOMEM, errno); 71 errno = 0; 72 ASSERT_EQ(NULL, calloc(SIZE_MAX, 2)); 73 ASSERT_EQ(ENOMEM, errno); 74} 75 76TEST(malloc, memalign_multiple) { 77 // Memalign test where the alignment is any value. 78 for (size_t i = 0; i <= 12; i++) { 79 for (size_t alignment = 1 << i; alignment < (1U << (i+1)); alignment++) { 80 char *ptr = reinterpret_cast<char*>(memalign(alignment, 100)); 81 ASSERT_TRUE(ptr != NULL) << "Failed at alignment " << alignment; 82 ASSERT_LE(100U, malloc_usable_size(ptr)) << "Failed at alignment " << alignment; 83 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % ((1U << i))) 84 << "Failed at alignment " << alignment; 85 free(ptr); 86 } 87 } 88} 89 90TEST(malloc, memalign_overflow) { 91 ASSERT_EQ(NULL, memalign(4096, SIZE_MAX)); 92} 93 94TEST(malloc, memalign_non_power2) { 95 void* ptr; 96 for (size_t align = 0; align <= 256; align++) { 97 ptr = memalign(align, 1024); 98 ASSERT_TRUE(ptr != NULL) << "Failed at align " << align; 99 free(ptr); 100 } 101} 102 103TEST(malloc, posix_memalign_non_power2) { 104 void* ptr; 105 ASSERT_EQ(EINVAL, posix_memalign(&ptr, 17, 1024)); 106} 107 108TEST(malloc, posix_memalign_overflow) { 109 void* ptr; 110 ASSERT_NE(0, posix_memalign(&ptr, 16, SIZE_MAX)); 111} 112 113TEST(malloc, memalign_realloc) { 114 // Memalign and then realloc the pointer a couple of times. 115 for (size_t alignment = 1; alignment <= 4096; alignment <<= 1) { 116 char *ptr = (char*)memalign(alignment, 100); 117 ASSERT_TRUE(ptr != NULL); 118 ASSERT_LE(100U, malloc_usable_size(ptr)); 119 ASSERT_EQ(0U, (intptr_t)ptr % alignment); 120 memset(ptr, 0x23, 100); 121 122 ptr = (char*)realloc(ptr, 200); 123 ASSERT_TRUE(ptr != NULL); 124 ASSERT_LE(200U, malloc_usable_size(ptr)); 125 ASSERT_TRUE(ptr != NULL); 126 for (size_t i = 0; i < 100; i++) { 127 ASSERT_EQ(0x23, ptr[i]); 128 } 129 memset(ptr, 0x45, 200); 130 131 ptr = (char*)realloc(ptr, 300); 132 ASSERT_TRUE(ptr != NULL); 133 ASSERT_LE(300U, malloc_usable_size(ptr)); 134 for (size_t i = 0; i < 200; i++) { 135 ASSERT_EQ(0x45, ptr[i]); 136 } 137 memset(ptr, 0x67, 300); 138 139 ptr = (char*)realloc(ptr, 250); 140 ASSERT_TRUE(ptr != NULL); 141 ASSERT_LE(250U, malloc_usable_size(ptr)); 142 for (size_t i = 0; i < 250; i++) { 143 ASSERT_EQ(0x67, ptr[i]); 144 } 145 free(ptr); 146 } 147} 148 149TEST(malloc, malloc_realloc_larger) { 150 // Realloc to a larger size, malloc is used for the original allocation. 151 char *ptr = (char *)malloc(100); 152 ASSERT_TRUE(ptr != NULL); 153 ASSERT_LE(100U, malloc_usable_size(ptr)); 154 memset(ptr, 67, 100); 155 156 ptr = (char *)realloc(ptr, 200); 157 ASSERT_TRUE(ptr != NULL); 158 ASSERT_LE(200U, malloc_usable_size(ptr)); 159 for (size_t i = 0; i < 100; i++) { 160 ASSERT_EQ(67, ptr[i]); 161 } 162 free(ptr); 163} 164 165TEST(malloc, malloc_realloc_smaller) { 166 // Realloc to a smaller size, malloc is used for the original allocation. 167 char *ptr = (char *)malloc(200); 168 ASSERT_TRUE(ptr != NULL); 169 ASSERT_LE(200U, malloc_usable_size(ptr)); 170 memset(ptr, 67, 200); 171 172 ptr = (char *)realloc(ptr, 100); 173 ASSERT_TRUE(ptr != NULL); 174 ASSERT_LE(100U, malloc_usable_size(ptr)); 175 for (size_t i = 0; i < 100; i++) { 176 ASSERT_EQ(67, ptr[i]); 177 } 178 free(ptr); 179} 180 181TEST(malloc, malloc_multiple_realloc) { 182 // Multiple reallocs, malloc is used for the original allocation. 183 char *ptr = (char *)malloc(200); 184 ASSERT_TRUE(ptr != NULL); 185 ASSERT_LE(200U, malloc_usable_size(ptr)); 186 memset(ptr, 0x23, 200); 187 188 ptr = (char *)realloc(ptr, 100); 189 ASSERT_TRUE(ptr != NULL); 190 ASSERT_LE(100U, malloc_usable_size(ptr)); 191 for (size_t i = 0; i < 100; i++) { 192 ASSERT_EQ(0x23, ptr[i]); 193 } 194 195 ptr = (char*)realloc(ptr, 50); 196 ASSERT_TRUE(ptr != NULL); 197 ASSERT_LE(50U, malloc_usable_size(ptr)); 198 for (size_t i = 0; i < 50; i++) { 199 ASSERT_EQ(0x23, ptr[i]); 200 } 201 202 ptr = (char*)realloc(ptr, 150); 203 ASSERT_TRUE(ptr != NULL); 204 ASSERT_LE(150U, malloc_usable_size(ptr)); 205 for (size_t i = 0; i < 50; i++) { 206 ASSERT_EQ(0x23, ptr[i]); 207 } 208 memset(ptr, 0x23, 150); 209 210 ptr = (char*)realloc(ptr, 425); 211 ASSERT_TRUE(ptr != NULL); 212 ASSERT_LE(425U, malloc_usable_size(ptr)); 213 for (size_t i = 0; i < 150; i++) { 214 ASSERT_EQ(0x23, ptr[i]); 215 } 216 free(ptr); 217} 218 219TEST(malloc, calloc_realloc_larger) { 220 // Realloc to a larger size, calloc is used for the original allocation. 221 char *ptr = (char *)calloc(1, 100); 222 ASSERT_TRUE(ptr != NULL); 223 ASSERT_LE(100U, malloc_usable_size(ptr)); 224 225 ptr = (char *)realloc(ptr, 200); 226 ASSERT_TRUE(ptr != NULL); 227 ASSERT_LE(200U, malloc_usable_size(ptr)); 228 for (size_t i = 0; i < 100; i++) { 229 ASSERT_EQ(0, ptr[i]); 230 } 231 free(ptr); 232} 233 234TEST(malloc, calloc_realloc_smaller) { 235 // Realloc to a smaller size, calloc is used for the original allocation. 236 char *ptr = (char *)calloc(1, 200); 237 ASSERT_TRUE(ptr != NULL); 238 ASSERT_LE(200U, malloc_usable_size(ptr)); 239 240 ptr = (char *)realloc(ptr, 100); 241 ASSERT_TRUE(ptr != NULL); 242 ASSERT_LE(100U, malloc_usable_size(ptr)); 243 for (size_t i = 0; i < 100; i++) { 244 ASSERT_EQ(0, ptr[i]); 245 } 246 free(ptr); 247} 248 249TEST(malloc, calloc_multiple_realloc) { 250 // Multiple reallocs, calloc is used for the original allocation. 251 char *ptr = (char *)calloc(1, 200); 252 ASSERT_TRUE(ptr != NULL); 253 ASSERT_LE(200U, malloc_usable_size(ptr)); 254 255 ptr = (char *)realloc(ptr, 100); 256 ASSERT_TRUE(ptr != NULL); 257 ASSERT_LE(100U, malloc_usable_size(ptr)); 258 for (size_t i = 0; i < 100; i++) { 259 ASSERT_EQ(0, ptr[i]); 260 } 261 262 ptr = (char*)realloc(ptr, 50); 263 ASSERT_TRUE(ptr != NULL); 264 ASSERT_LE(50U, malloc_usable_size(ptr)); 265 for (size_t i = 0; i < 50; i++) { 266 ASSERT_EQ(0, ptr[i]); 267 } 268 269 ptr = (char*)realloc(ptr, 150); 270 ASSERT_TRUE(ptr != NULL); 271 ASSERT_LE(150U, malloc_usable_size(ptr)); 272 for (size_t i = 0; i < 50; i++) { 273 ASSERT_EQ(0, ptr[i]); 274 } 275 memset(ptr, 0, 150); 276 277 ptr = (char*)realloc(ptr, 425); 278 ASSERT_TRUE(ptr != NULL); 279 ASSERT_LE(425U, malloc_usable_size(ptr)); 280 for (size_t i = 0; i < 150; i++) { 281 ASSERT_EQ(0, ptr[i]); 282 } 283 free(ptr); 284} 285 286TEST(malloc, realloc_overflow) { 287 errno = 0; 288 ASSERT_EQ(NULL, realloc(NULL, SIZE_MAX)); 289 ASSERT_EQ(ENOMEM, errno); 290 void* ptr = malloc(100); 291 ASSERT_TRUE(ptr != NULL); 292 errno = 0; 293 ASSERT_EQ(NULL, realloc(ptr, SIZE_MAX)); 294 ASSERT_EQ(ENOMEM, errno); 295 free(ptr); 296} 297 298#if defined(HAVE_DEPRECATED_MALLOC_FUNCS) 299extern "C" void* pvalloc(size_t); 300extern "C" void* valloc(size_t); 301 302TEST(malloc, pvalloc_std) { 303 size_t pagesize = sysconf(_SC_PAGESIZE); 304 void* ptr = pvalloc(100); 305 ASSERT_TRUE(ptr != NULL); 306 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0); 307 ASSERT_LE(pagesize, malloc_usable_size(ptr)); 308 free(ptr); 309} 310 311TEST(malloc, pvalloc_overflow) { 312 ASSERT_EQ(NULL, pvalloc(SIZE_MAX)); 313} 314 315TEST(malloc, valloc_std) { 316 size_t pagesize = sysconf(_SC_PAGESIZE); 317 void* ptr = pvalloc(100); 318 ASSERT_TRUE(ptr != NULL); 319 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0); 320 free(ptr); 321} 322 323TEST(malloc, valloc_overflow) { 324 ASSERT_EQ(NULL, valloc(SIZE_MAX)); 325} 326#endif 327