blob: 4161c90943ebac4074bb8af434d3b5fe48d7c0b4 [file] [log] [blame]
Christopher Ferris885f3b92013-05-21 17:48:01 -07001/*
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
Christopher Ferrisa4037802014-06-09 19:14:11 -070019#include <limits.h>
20#include <stdint.h>
Christopher Ferris885f3b92013-05-21 17:48:01 -070021#include <stdlib.h>
22#include <malloc.h>
Christopher Ferrisa4037802014-06-09 19:14:11 -070023#include <unistd.h>
Christopher Ferris885f3b92013-05-21 17:48:01 -070024
Dan Albert4caa1f02014-08-20 09:16:57 -070025#include <tinyxml2.h>
26
Christopher Ferris63619642014-06-16 23:35:53 -070027#include "private/bionic_config.h"
Dan Alberte5fdaa42014-06-14 01:04:31 +000028
Christopher Ferris885f3b92013-05-21 17:48:01 -070029TEST(malloc, malloc_std) {
30 // Simple malloc test.
31 void *ptr = malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -070032 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -070033 ASSERT_LE(100U, malloc_usable_size(ptr));
Christopher Ferris885f3b92013-05-21 17:48:01 -070034 free(ptr);
35}
36
Christopher Ferrisa4037802014-06-09 19:14:11 -070037TEST(malloc, malloc_overflow) {
38 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070039 ASSERT_EQ(nullptr, malloc(SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070040 ASSERT_EQ(ENOMEM, errno);
41}
42
Christopher Ferris885f3b92013-05-21 17:48:01 -070043TEST(malloc, calloc_std) {
44 // Simple calloc test.
45 size_t alloc_len = 100;
46 char *ptr = (char *)calloc(1, alloc_len);
Yi Kong32bc0fc2018-08-02 17:31:13 -070047 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -070048 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 }
Christopher Ferris885f3b92013-05-21 17:48:01 -070052 free(ptr);
53}
54
Christopher Ferrisa4037802014-06-09 19:14:11 -070055TEST(malloc, calloc_illegal) {
56 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070057 ASSERT_EQ(nullptr, calloc(-1, 100));
Christopher Ferrisa4037802014-06-09 19:14:11 -070058 ASSERT_EQ(ENOMEM, errno);
59}
60
61TEST(malloc, calloc_overflow) {
62 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070063 ASSERT_EQ(nullptr, calloc(1, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070064 ASSERT_EQ(ENOMEM, errno);
65 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070066 ASSERT_EQ(nullptr, calloc(SIZE_MAX, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070067 ASSERT_EQ(ENOMEM, errno);
68 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070069 ASSERT_EQ(nullptr, calloc(2, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070070 ASSERT_EQ(ENOMEM, errno);
71 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070072 ASSERT_EQ(nullptr, calloc(SIZE_MAX, 2));
Christopher Ferrisa4037802014-06-09 19:14:11 -070073 ASSERT_EQ(ENOMEM, errno);
74}
75
Christopher Ferris885f3b92013-05-21 17:48:01 -070076TEST(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++) {
Christopher Ferrisa4037802014-06-09 19:14:11 -070080 char *ptr = reinterpret_cast<char*>(memalign(alignment, 100));
Yi Kong32bc0fc2018-08-02 17:31:13 -070081 ASSERT_TRUE(ptr != nullptr) << "Failed at alignment " << alignment;
Christopher Ferrisa4037802014-06-09 19:14:11 -070082 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;
Christopher Ferris885f3b92013-05-21 17:48:01 -070085 free(ptr);
86 }
87 }
88}
89
Christopher Ferrisa4037802014-06-09 19:14:11 -070090TEST(malloc, memalign_overflow) {
Yi Kong32bc0fc2018-08-02 17:31:13 -070091 ASSERT_EQ(nullptr, memalign(4096, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070092}
93
94TEST(malloc, memalign_non_power2) {
95 void* ptr;
96 for (size_t align = 0; align <= 256; align++) {
97 ptr = memalign(align, 1024);
Yi Kong32bc0fc2018-08-02 17:31:13 -070098 ASSERT_TRUE(ptr != nullptr) << "Failed at align " << align;
Christopher Ferrisa4037802014-06-09 19:14:11 -070099 free(ptr);
100 }
101}
102
Christopher Ferris885f3b92013-05-21 17:48:01 -0700103TEST(malloc, memalign_realloc) {
104 // Memalign and then realloc the pointer a couple of times.
105 for (size_t alignment = 1; alignment <= 4096; alignment <<= 1) {
106 char *ptr = (char*)memalign(alignment, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700107 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700108 ASSERT_LE(100U, malloc_usable_size(ptr));
109 ASSERT_EQ(0U, (intptr_t)ptr % alignment);
110 memset(ptr, 0x23, 100);
111
112 ptr = (char*)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700113 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700114 ASSERT_LE(200U, malloc_usable_size(ptr));
Yi Kong32bc0fc2018-08-02 17:31:13 -0700115 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700116 for (size_t i = 0; i < 100; i++) {
117 ASSERT_EQ(0x23, ptr[i]);
118 }
119 memset(ptr, 0x45, 200);
120
121 ptr = (char*)realloc(ptr, 300);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700122 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700123 ASSERT_LE(300U, malloc_usable_size(ptr));
124 for (size_t i = 0; i < 200; i++) {
125 ASSERT_EQ(0x45, ptr[i]);
126 }
127 memset(ptr, 0x67, 300);
128
129 ptr = (char*)realloc(ptr, 250);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700130 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700131 ASSERT_LE(250U, malloc_usable_size(ptr));
132 for (size_t i = 0; i < 250; i++) {
133 ASSERT_EQ(0x67, ptr[i]);
134 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700135 free(ptr);
136 }
137}
138
139TEST(malloc, malloc_realloc_larger) {
140 // Realloc to a larger size, malloc is used for the original allocation.
141 char *ptr = (char *)malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700142 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700143 ASSERT_LE(100U, malloc_usable_size(ptr));
144 memset(ptr, 67, 100);
145
146 ptr = (char *)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700147 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700148 ASSERT_LE(200U, malloc_usable_size(ptr));
149 for (size_t i = 0; i < 100; i++) {
150 ASSERT_EQ(67, ptr[i]);
151 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700152 free(ptr);
153}
154
155TEST(malloc, malloc_realloc_smaller) {
156 // Realloc to a smaller size, malloc is used for the original allocation.
157 char *ptr = (char *)malloc(200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700158 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700159 ASSERT_LE(200U, malloc_usable_size(ptr));
160 memset(ptr, 67, 200);
161
162 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700163 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700164 ASSERT_LE(100U, malloc_usable_size(ptr));
165 for (size_t i = 0; i < 100; i++) {
166 ASSERT_EQ(67, ptr[i]);
167 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700168 free(ptr);
169}
170
171TEST(malloc, malloc_multiple_realloc) {
172 // Multiple reallocs, malloc is used for the original allocation.
173 char *ptr = (char *)malloc(200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700174 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700175 ASSERT_LE(200U, malloc_usable_size(ptr));
176 memset(ptr, 0x23, 200);
177
178 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700179 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700180 ASSERT_LE(100U, malloc_usable_size(ptr));
181 for (size_t i = 0; i < 100; i++) {
182 ASSERT_EQ(0x23, ptr[i]);
183 }
184
185 ptr = (char*)realloc(ptr, 50);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700186 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700187 ASSERT_LE(50U, malloc_usable_size(ptr));
188 for (size_t i = 0; i < 50; i++) {
189 ASSERT_EQ(0x23, ptr[i]);
190 }
191
192 ptr = (char*)realloc(ptr, 150);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700193 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700194 ASSERT_LE(150U, malloc_usable_size(ptr));
195 for (size_t i = 0; i < 50; i++) {
196 ASSERT_EQ(0x23, ptr[i]);
197 }
198 memset(ptr, 0x23, 150);
199
200 ptr = (char*)realloc(ptr, 425);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700201 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700202 ASSERT_LE(425U, malloc_usable_size(ptr));
203 for (size_t i = 0; i < 150; i++) {
204 ASSERT_EQ(0x23, ptr[i]);
205 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700206 free(ptr);
207}
Christopher Ferrisa4037802014-06-09 19:14:11 -0700208
Christopher Ferris885f3b92013-05-21 17:48:01 -0700209TEST(malloc, calloc_realloc_larger) {
210 // Realloc to a larger size, calloc is used for the original allocation.
211 char *ptr = (char *)calloc(1, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700212 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700213 ASSERT_LE(100U, malloc_usable_size(ptr));
214
215 ptr = (char *)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700216 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700217 ASSERT_LE(200U, malloc_usable_size(ptr));
218 for (size_t i = 0; i < 100; i++) {
219 ASSERT_EQ(0, ptr[i]);
220 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700221 free(ptr);
222}
223
224TEST(malloc, calloc_realloc_smaller) {
225 // Realloc to a smaller size, calloc is used for the original allocation.
226 char *ptr = (char *)calloc(1, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700227 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700228 ASSERT_LE(200U, malloc_usable_size(ptr));
229
230 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700231 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700232 ASSERT_LE(100U, malloc_usable_size(ptr));
233 for (size_t i = 0; i < 100; i++) {
234 ASSERT_EQ(0, ptr[i]);
235 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700236 free(ptr);
237}
238
239TEST(malloc, calloc_multiple_realloc) {
240 // Multiple reallocs, calloc is used for the original allocation.
241 char *ptr = (char *)calloc(1, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700242 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700243 ASSERT_LE(200U, malloc_usable_size(ptr));
244
245 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700246 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700247 ASSERT_LE(100U, malloc_usable_size(ptr));
248 for (size_t i = 0; i < 100; i++) {
249 ASSERT_EQ(0, ptr[i]);
250 }
251
252 ptr = (char*)realloc(ptr, 50);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700253 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700254 ASSERT_LE(50U, malloc_usable_size(ptr));
255 for (size_t i = 0; i < 50; i++) {
256 ASSERT_EQ(0, ptr[i]);
257 }
258
259 ptr = (char*)realloc(ptr, 150);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700260 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700261 ASSERT_LE(150U, malloc_usable_size(ptr));
262 for (size_t i = 0; i < 50; i++) {
263 ASSERT_EQ(0, ptr[i]);
264 }
265 memset(ptr, 0, 150);
266
267 ptr = (char*)realloc(ptr, 425);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700268 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700269 ASSERT_LE(425U, malloc_usable_size(ptr));
270 for (size_t i = 0; i < 150; i++) {
271 ASSERT_EQ(0, ptr[i]);
272 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700273 free(ptr);
274}
Christopher Ferris72bbd422014-05-08 11:14:03 -0700275
Christopher Ferrisa4037802014-06-09 19:14:11 -0700276TEST(malloc, realloc_overflow) {
277 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700278 ASSERT_EQ(nullptr, realloc(nullptr, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700279 ASSERT_EQ(ENOMEM, errno);
280 void* ptr = malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700281 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700282 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700283 ASSERT_EQ(nullptr, realloc(ptr, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700284 ASSERT_EQ(ENOMEM, errno);
285 free(ptr);
Christopher Ferris72bbd422014-05-08 11:14:03 -0700286}
287
Dan Alberte5fdaa42014-06-14 01:04:31 +0000288#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
289extern "C" void* pvalloc(size_t);
290extern "C" void* valloc(size_t);
291
Christopher Ferrisa4037802014-06-09 19:14:11 -0700292TEST(malloc, pvalloc_std) {
293 size_t pagesize = sysconf(_SC_PAGESIZE);
294 void* ptr = pvalloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700295 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700296 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0);
297 ASSERT_LE(pagesize, malloc_usable_size(ptr));
298 free(ptr);
299}
300
301TEST(malloc, pvalloc_overflow) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700302 ASSERT_EQ(nullptr, pvalloc(SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700303}
304
305TEST(malloc, valloc_std) {
306 size_t pagesize = sysconf(_SC_PAGESIZE);
307 void* ptr = pvalloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700308 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700309 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0);
310 free(ptr);
311}
312
313TEST(malloc, valloc_overflow) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700314 ASSERT_EQ(nullptr, valloc(SIZE_MAX));
Christopher Ferris72bbd422014-05-08 11:14:03 -0700315}
Dan Alberte5fdaa42014-06-14 01:04:31 +0000316#endif
Dan Albert4caa1f02014-08-20 09:16:57 -0700317
318TEST(malloc, malloc_info) {
319#ifdef __BIONIC__
320 char* buf;
321 size_t bufsize;
322 FILE* memstream = open_memstream(&buf, &bufsize);
323 ASSERT_NE(nullptr, memstream);
324 ASSERT_EQ(0, malloc_info(0, memstream));
325 ASSERT_EQ(0, fclose(memstream));
326
327 tinyxml2::XMLDocument doc;
328 ASSERT_EQ(tinyxml2::XML_SUCCESS, doc.Parse(buf));
329
330 auto root = doc.FirstChildElement();
331 ASSERT_NE(nullptr, root);
332 ASSERT_STREQ("malloc", root->Name());
333 ASSERT_STREQ("jemalloc-1", root->Attribute("version"));
334
335 auto arena = root->FirstChildElement();
336 for (; arena != nullptr; arena = arena->NextSiblingElement()) {
337 int val;
338
339 ASSERT_STREQ("heap", arena->Name());
340 ASSERT_EQ(tinyxml2::XML_SUCCESS, arena->QueryIntAttribute("nr", &val));
341 ASSERT_EQ(tinyxml2::XML_SUCCESS,
342 arena->FirstChildElement("allocated-large")->QueryIntText(&val));
343 ASSERT_EQ(tinyxml2::XML_SUCCESS,
344 arena->FirstChildElement("allocated-huge")->QueryIntText(&val));
345 ASSERT_EQ(tinyxml2::XML_SUCCESS,
346 arena->FirstChildElement("allocated-bins")->QueryIntText(&val));
347 ASSERT_EQ(tinyxml2::XML_SUCCESS,
348 arena->FirstChildElement("bins-total")->QueryIntText(&val));
349
350 auto bin = arena->FirstChildElement("bin");
351 for (; bin != nullptr; bin = bin ->NextSiblingElement()) {
352 if (strcmp(bin->Name(), "bin") == 0) {
353 ASSERT_EQ(tinyxml2::XML_SUCCESS, bin->QueryIntAttribute("nr", &val));
354 ASSERT_EQ(tinyxml2::XML_SUCCESS,
355 bin->FirstChildElement("allocated")->QueryIntText(&val));
356 ASSERT_EQ(tinyxml2::XML_SUCCESS,
357 bin->FirstChildElement("nmalloc")->QueryIntText(&val));
358 ASSERT_EQ(tinyxml2::XML_SUCCESS,
359 bin->FirstChildElement("ndalloc")->QueryIntText(&val));
360 }
361 }
362 }
363#endif
364}
Christopher Ferrisad33ebe2015-12-16 12:07:25 -0800365
366TEST(malloc, calloc_usable_size) {
367 for (size_t size = 1; size <= 2048; size++) {
368 void* pointer = malloc(size);
369 ASSERT_TRUE(pointer != nullptr);
370 memset(pointer, 0xeb, malloc_usable_size(pointer));
371 free(pointer);
372
373 // We should get a previous pointer that has been set to non-zero.
374 // If calloc does not zero out all of the data, this will fail.
375 uint8_t* zero_mem = reinterpret_cast<uint8_t*>(calloc(1, size));
376 ASSERT_TRUE(pointer != nullptr);
377 size_t usable_size = malloc_usable_size(zero_mem);
378 for (size_t i = 0; i < usable_size; i++) {
379 ASSERT_EQ(0, zero_mem[i]) << "Failed at allocation size " << size << " at byte " << i;
380 }
381 free(zero_mem);
382 }
383}
Elliott Hughes884f76e2016-02-10 20:43:22 -0800384
385TEST(malloc, malloc_0) {
386 void* p = malloc(0);
387 ASSERT_TRUE(p != nullptr);
388 free(p);
389}
390
391TEST(malloc, calloc_0_0) {
392 void* p = calloc(0, 0);
393 ASSERT_TRUE(p != nullptr);
394 free(p);
395}
396
397TEST(malloc, calloc_0_1) {
398 void* p = calloc(0, 1);
399 ASSERT_TRUE(p != nullptr);
400 free(p);
401}
402
403TEST(malloc, calloc_1_0) {
404 void* p = calloc(1, 0);
405 ASSERT_TRUE(p != nullptr);
406 free(p);
407}
408
409TEST(malloc, realloc_nullptr_0) {
410 // realloc(nullptr, size) is actually malloc(size).
411 void* p = realloc(nullptr, 0);
412 ASSERT_TRUE(p != nullptr);
413 free(p);
414}
415
416TEST(malloc, realloc_0) {
417 void* p = malloc(1024);
418 ASSERT_TRUE(p != nullptr);
419 // realloc(p, 0) is actually free(p).
420 void* p2 = realloc(p, 0);
421 ASSERT_TRUE(p2 == nullptr);
422}
Christopher Ferris72df6702016-02-11 15:51:31 -0800423
424constexpr size_t MAX_LOOPS = 200;
425
426// Make sure that memory returned by malloc is aligned to allow these data types.
427TEST(malloc, verify_alignment) {
428 uint32_t** values_32 = new uint32_t*[MAX_LOOPS];
429 uint64_t** values_64 = new uint64_t*[MAX_LOOPS];
430 long double** values_ldouble = new long double*[MAX_LOOPS];
431 // Use filler to attempt to force the allocator to get potentially bad alignments.
432 void** filler = new void*[MAX_LOOPS];
433
434 for (size_t i = 0; i < MAX_LOOPS; i++) {
435 // Check uint32_t pointers.
436 filler[i] = malloc(1);
437 ASSERT_TRUE(filler[i] != nullptr);
438
439 values_32[i] = reinterpret_cast<uint32_t*>(malloc(sizeof(uint32_t)));
440 ASSERT_TRUE(values_32[i] != nullptr);
441 *values_32[i] = i;
442 ASSERT_EQ(*values_32[i], i);
443 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_32[i]) & (sizeof(uint32_t) - 1));
444
445 free(filler[i]);
446 }
447
448 for (size_t i = 0; i < MAX_LOOPS; i++) {
449 // Check uint64_t pointers.
450 filler[i] = malloc(1);
451 ASSERT_TRUE(filler[i] != nullptr);
452
453 values_64[i] = reinterpret_cast<uint64_t*>(malloc(sizeof(uint64_t)));
454 ASSERT_TRUE(values_64[i] != nullptr);
455 *values_64[i] = 0x1000 + i;
456 ASSERT_EQ(*values_64[i], 0x1000 + i);
457 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_64[i]) & (sizeof(uint64_t) - 1));
458
459 free(filler[i]);
460 }
461
462 for (size_t i = 0; i < MAX_LOOPS; i++) {
463 // Check long double pointers.
464 filler[i] = malloc(1);
465 ASSERT_TRUE(filler[i] != nullptr);
466
467 values_ldouble[i] = reinterpret_cast<long double*>(malloc(sizeof(long double)));
468 ASSERT_TRUE(values_ldouble[i] != nullptr);
469 *values_ldouble[i] = 5.5 + i;
470 ASSERT_DOUBLE_EQ(*values_ldouble[i], 5.5 + i);
471 // 32 bit glibc has a long double size of 12 bytes, so hardcode the
472 // required alignment to 0x7.
473#if !defined(__BIONIC__) && !defined(__LP64__)
474 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_ldouble[i]) & 0x7);
475#else
476 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_ldouble[i]) & (sizeof(long double) - 1));
477#endif
478
479 free(filler[i]);
480 }
481
482 for (size_t i = 0; i < MAX_LOOPS; i++) {
483 free(values_32[i]);
484 free(values_64[i]);
485 free(values_ldouble[i]);
486 }
487
488 delete[] filler;
489 delete[] values_32;
490 delete[] values_64;
491 delete[] values_ldouble;
492}
Christopher Ferrisa1c0d2f2017-05-15 15:50:19 -0700493
494TEST(malloc, mallopt_smoke) {
495 errno = 0;
496 ASSERT_EQ(0, mallopt(-1000, 1));
497 // mallopt doesn't set errno.
498 ASSERT_EQ(0, errno);
499}