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