blob: c4f13f6e7999073f171c74b55e8869cc192b24c8 [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
Elliott Hughesb1770852018-09-18 12:52:42 -070029#if defined(__BIONIC__)
30#define HAVE_REALLOCARRAY 1
31#else
32#define HAVE_REALLOCARRAY __GLIBC_PREREQ(2, 26)
33#endif
34
Christopher Ferris885f3b92013-05-21 17:48:01 -070035TEST(malloc, malloc_std) {
36 // Simple malloc test.
37 void *ptr = malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -070038 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -070039 ASSERT_LE(100U, malloc_usable_size(ptr));
Christopher Ferris885f3b92013-05-21 17:48:01 -070040 free(ptr);
41}
42
Christopher Ferrisa4037802014-06-09 19:14:11 -070043TEST(malloc, malloc_overflow) {
44 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070045 ASSERT_EQ(nullptr, malloc(SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070046 ASSERT_EQ(ENOMEM, errno);
47}
48
Christopher Ferris885f3b92013-05-21 17:48:01 -070049TEST(malloc, calloc_std) {
50 // Simple calloc test.
51 size_t alloc_len = 100;
52 char *ptr = (char *)calloc(1, alloc_len);
Yi Kong32bc0fc2018-08-02 17:31:13 -070053 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -070054 ASSERT_LE(alloc_len, malloc_usable_size(ptr));
55 for (size_t i = 0; i < alloc_len; i++) {
56 ASSERT_EQ(0, ptr[i]);
57 }
Christopher Ferris885f3b92013-05-21 17:48:01 -070058 free(ptr);
59}
60
Christopher Ferrisa4037802014-06-09 19:14:11 -070061TEST(malloc, calloc_illegal) {
62 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070063 ASSERT_EQ(nullptr, calloc(-1, 100));
Christopher Ferrisa4037802014-06-09 19:14:11 -070064 ASSERT_EQ(ENOMEM, errno);
65}
66
67TEST(malloc, calloc_overflow) {
68 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070069 ASSERT_EQ(nullptr, calloc(1, 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, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070073 ASSERT_EQ(ENOMEM, errno);
74 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070075 ASSERT_EQ(nullptr, calloc(2, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070076 ASSERT_EQ(ENOMEM, errno);
77 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070078 ASSERT_EQ(nullptr, calloc(SIZE_MAX, 2));
Christopher Ferrisa4037802014-06-09 19:14:11 -070079 ASSERT_EQ(ENOMEM, errno);
80}
81
Christopher Ferris885f3b92013-05-21 17:48:01 -070082TEST(malloc, memalign_multiple) {
83 // Memalign test where the alignment is any value.
84 for (size_t i = 0; i <= 12; i++) {
85 for (size_t alignment = 1 << i; alignment < (1U << (i+1)); alignment++) {
Christopher Ferrisa4037802014-06-09 19:14:11 -070086 char *ptr = reinterpret_cast<char*>(memalign(alignment, 100));
Yi Kong32bc0fc2018-08-02 17:31:13 -070087 ASSERT_TRUE(ptr != nullptr) << "Failed at alignment " << alignment;
Christopher Ferrisa4037802014-06-09 19:14:11 -070088 ASSERT_LE(100U, malloc_usable_size(ptr)) << "Failed at alignment " << alignment;
89 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % ((1U << i)))
90 << "Failed at alignment " << alignment;
Christopher Ferris885f3b92013-05-21 17:48:01 -070091 free(ptr);
92 }
93 }
94}
95
Christopher Ferrisa4037802014-06-09 19:14:11 -070096TEST(malloc, memalign_overflow) {
Yi Kong32bc0fc2018-08-02 17:31:13 -070097 ASSERT_EQ(nullptr, memalign(4096, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070098}
99
100TEST(malloc, memalign_non_power2) {
101 void* ptr;
102 for (size_t align = 0; align <= 256; align++) {
103 ptr = memalign(align, 1024);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700104 ASSERT_TRUE(ptr != nullptr) << "Failed at align " << align;
Christopher Ferrisa4037802014-06-09 19:14:11 -0700105 free(ptr);
106 }
107}
108
Christopher Ferris885f3b92013-05-21 17:48:01 -0700109TEST(malloc, memalign_realloc) {
110 // Memalign and then realloc the pointer a couple of times.
111 for (size_t alignment = 1; alignment <= 4096; alignment <<= 1) {
112 char *ptr = (char*)memalign(alignment, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700113 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700114 ASSERT_LE(100U, malloc_usable_size(ptr));
115 ASSERT_EQ(0U, (intptr_t)ptr % alignment);
116 memset(ptr, 0x23, 100);
117
118 ptr = (char*)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700119 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700120 ASSERT_LE(200U, malloc_usable_size(ptr));
Yi Kong32bc0fc2018-08-02 17:31:13 -0700121 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700122 for (size_t i = 0; i < 100; i++) {
123 ASSERT_EQ(0x23, ptr[i]);
124 }
125 memset(ptr, 0x45, 200);
126
127 ptr = (char*)realloc(ptr, 300);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700128 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700129 ASSERT_LE(300U, malloc_usable_size(ptr));
130 for (size_t i = 0; i < 200; i++) {
131 ASSERT_EQ(0x45, ptr[i]);
132 }
133 memset(ptr, 0x67, 300);
134
135 ptr = (char*)realloc(ptr, 250);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700136 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700137 ASSERT_LE(250U, malloc_usable_size(ptr));
138 for (size_t i = 0; i < 250; i++) {
139 ASSERT_EQ(0x67, ptr[i]);
140 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700141 free(ptr);
142 }
143}
144
145TEST(malloc, malloc_realloc_larger) {
146 // Realloc to a larger size, malloc is used for the original allocation.
147 char *ptr = (char *)malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700148 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700149 ASSERT_LE(100U, malloc_usable_size(ptr));
150 memset(ptr, 67, 100);
151
152 ptr = (char *)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700153 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700154 ASSERT_LE(200U, malloc_usable_size(ptr));
155 for (size_t i = 0; i < 100; i++) {
156 ASSERT_EQ(67, ptr[i]);
157 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700158 free(ptr);
159}
160
161TEST(malloc, malloc_realloc_smaller) {
162 // Realloc to a smaller size, malloc is used for the original allocation.
163 char *ptr = (char *)malloc(200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700164 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700165 ASSERT_LE(200U, malloc_usable_size(ptr));
166 memset(ptr, 67, 200);
167
168 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700169 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700170 ASSERT_LE(100U, malloc_usable_size(ptr));
171 for (size_t i = 0; i < 100; i++) {
172 ASSERT_EQ(67, ptr[i]);
173 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700174 free(ptr);
175}
176
177TEST(malloc, malloc_multiple_realloc) {
178 // Multiple reallocs, malloc is used for the original allocation.
179 char *ptr = (char *)malloc(200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700180 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700181 ASSERT_LE(200U, malloc_usable_size(ptr));
182 memset(ptr, 0x23, 200);
183
184 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700185 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700186 ASSERT_LE(100U, malloc_usable_size(ptr));
187 for (size_t i = 0; i < 100; i++) {
188 ASSERT_EQ(0x23, ptr[i]);
189 }
190
191 ptr = (char*)realloc(ptr, 50);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700192 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700193 ASSERT_LE(50U, malloc_usable_size(ptr));
194 for (size_t i = 0; i < 50; i++) {
195 ASSERT_EQ(0x23, ptr[i]);
196 }
197
198 ptr = (char*)realloc(ptr, 150);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700199 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700200 ASSERT_LE(150U, malloc_usable_size(ptr));
201 for (size_t i = 0; i < 50; i++) {
202 ASSERT_EQ(0x23, ptr[i]);
203 }
204 memset(ptr, 0x23, 150);
205
206 ptr = (char*)realloc(ptr, 425);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700207 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700208 ASSERT_LE(425U, malloc_usable_size(ptr));
209 for (size_t i = 0; i < 150; i++) {
210 ASSERT_EQ(0x23, ptr[i]);
211 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700212 free(ptr);
213}
Christopher Ferrisa4037802014-06-09 19:14:11 -0700214
Christopher Ferris885f3b92013-05-21 17:48:01 -0700215TEST(malloc, calloc_realloc_larger) {
216 // Realloc to a larger size, calloc is used for the original allocation.
217 char *ptr = (char *)calloc(1, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700218 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700219 ASSERT_LE(100U, malloc_usable_size(ptr));
220
221 ptr = (char *)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700222 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700223 ASSERT_LE(200U, malloc_usable_size(ptr));
224 for (size_t i = 0; i < 100; i++) {
225 ASSERT_EQ(0, ptr[i]);
226 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700227 free(ptr);
228}
229
230TEST(malloc, calloc_realloc_smaller) {
231 // Realloc to a smaller size, calloc is used for the original allocation.
232 char *ptr = (char *)calloc(1, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700233 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700234 ASSERT_LE(200U, malloc_usable_size(ptr));
235
236 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700237 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700238 ASSERT_LE(100U, malloc_usable_size(ptr));
239 for (size_t i = 0; i < 100; i++) {
240 ASSERT_EQ(0, ptr[i]);
241 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700242 free(ptr);
243}
244
245TEST(malloc, calloc_multiple_realloc) {
246 // Multiple reallocs, calloc is used for the original allocation.
247 char *ptr = (char *)calloc(1, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700248 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700249 ASSERT_LE(200U, malloc_usable_size(ptr));
250
251 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700252 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700253 ASSERT_LE(100U, malloc_usable_size(ptr));
254 for (size_t i = 0; i < 100; i++) {
255 ASSERT_EQ(0, ptr[i]);
256 }
257
258 ptr = (char*)realloc(ptr, 50);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700259 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700260 ASSERT_LE(50U, malloc_usable_size(ptr));
261 for (size_t i = 0; i < 50; i++) {
262 ASSERT_EQ(0, ptr[i]);
263 }
264
265 ptr = (char*)realloc(ptr, 150);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700266 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700267 ASSERT_LE(150U, malloc_usable_size(ptr));
268 for (size_t i = 0; i < 50; i++) {
269 ASSERT_EQ(0, ptr[i]);
270 }
271 memset(ptr, 0, 150);
272
273 ptr = (char*)realloc(ptr, 425);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700274 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700275 ASSERT_LE(425U, malloc_usable_size(ptr));
276 for (size_t i = 0; i < 150; i++) {
277 ASSERT_EQ(0, ptr[i]);
278 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700279 free(ptr);
280}
Christopher Ferris72bbd422014-05-08 11:14:03 -0700281
Christopher Ferrisa4037802014-06-09 19:14:11 -0700282TEST(malloc, realloc_overflow) {
283 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700284 ASSERT_EQ(nullptr, realloc(nullptr, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700285 ASSERT_EQ(ENOMEM, errno);
286 void* ptr = malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700287 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700288 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700289 ASSERT_EQ(nullptr, realloc(ptr, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700290 ASSERT_EQ(ENOMEM, errno);
291 free(ptr);
Christopher Ferris72bbd422014-05-08 11:14:03 -0700292}
293
Dan Alberte5fdaa42014-06-14 01:04:31 +0000294#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
295extern "C" void* pvalloc(size_t);
296extern "C" void* valloc(size_t);
297
Christopher Ferrisa4037802014-06-09 19:14:11 -0700298TEST(malloc, pvalloc_std) {
299 size_t pagesize = sysconf(_SC_PAGESIZE);
300 void* ptr = pvalloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700301 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700302 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0);
303 ASSERT_LE(pagesize, malloc_usable_size(ptr));
304 free(ptr);
305}
306
307TEST(malloc, pvalloc_overflow) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700308 ASSERT_EQ(nullptr, pvalloc(SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700309}
310
311TEST(malloc, valloc_std) {
312 size_t pagesize = sysconf(_SC_PAGESIZE);
313 void* ptr = pvalloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700314 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700315 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0);
316 free(ptr);
317}
318
319TEST(malloc, valloc_overflow) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700320 ASSERT_EQ(nullptr, valloc(SIZE_MAX));
Christopher Ferris72bbd422014-05-08 11:14:03 -0700321}
Dan Alberte5fdaa42014-06-14 01:04:31 +0000322#endif
Dan Albert4caa1f02014-08-20 09:16:57 -0700323
324TEST(malloc, malloc_info) {
325#ifdef __BIONIC__
326 char* buf;
327 size_t bufsize;
328 FILE* memstream = open_memstream(&buf, &bufsize);
329 ASSERT_NE(nullptr, memstream);
330 ASSERT_EQ(0, malloc_info(0, memstream));
331 ASSERT_EQ(0, fclose(memstream));
332
333 tinyxml2::XMLDocument doc;
334 ASSERT_EQ(tinyxml2::XML_SUCCESS, doc.Parse(buf));
335
336 auto root = doc.FirstChildElement();
337 ASSERT_NE(nullptr, root);
338 ASSERT_STREQ("malloc", root->Name());
339 ASSERT_STREQ("jemalloc-1", root->Attribute("version"));
340
341 auto arena = root->FirstChildElement();
342 for (; arena != nullptr; arena = arena->NextSiblingElement()) {
343 int val;
344
345 ASSERT_STREQ("heap", arena->Name());
346 ASSERT_EQ(tinyxml2::XML_SUCCESS, arena->QueryIntAttribute("nr", &val));
347 ASSERT_EQ(tinyxml2::XML_SUCCESS,
348 arena->FirstChildElement("allocated-large")->QueryIntText(&val));
349 ASSERT_EQ(tinyxml2::XML_SUCCESS,
350 arena->FirstChildElement("allocated-huge")->QueryIntText(&val));
351 ASSERT_EQ(tinyxml2::XML_SUCCESS,
352 arena->FirstChildElement("allocated-bins")->QueryIntText(&val));
353 ASSERT_EQ(tinyxml2::XML_SUCCESS,
354 arena->FirstChildElement("bins-total")->QueryIntText(&val));
355
356 auto bin = arena->FirstChildElement("bin");
357 for (; bin != nullptr; bin = bin ->NextSiblingElement()) {
358 if (strcmp(bin->Name(), "bin") == 0) {
359 ASSERT_EQ(tinyxml2::XML_SUCCESS, bin->QueryIntAttribute("nr", &val));
360 ASSERT_EQ(tinyxml2::XML_SUCCESS,
361 bin->FirstChildElement("allocated")->QueryIntText(&val));
362 ASSERT_EQ(tinyxml2::XML_SUCCESS,
363 bin->FirstChildElement("nmalloc")->QueryIntText(&val));
364 ASSERT_EQ(tinyxml2::XML_SUCCESS,
365 bin->FirstChildElement("ndalloc")->QueryIntText(&val));
366 }
367 }
368 }
369#endif
370}
Christopher Ferrisad33ebe2015-12-16 12:07:25 -0800371
372TEST(malloc, calloc_usable_size) {
373 for (size_t size = 1; size <= 2048; size++) {
374 void* pointer = malloc(size);
375 ASSERT_TRUE(pointer != nullptr);
376 memset(pointer, 0xeb, malloc_usable_size(pointer));
377 free(pointer);
378
379 // We should get a previous pointer that has been set to non-zero.
380 // If calloc does not zero out all of the data, this will fail.
381 uint8_t* zero_mem = reinterpret_cast<uint8_t*>(calloc(1, size));
382 ASSERT_TRUE(pointer != nullptr);
383 size_t usable_size = malloc_usable_size(zero_mem);
384 for (size_t i = 0; i < usable_size; i++) {
385 ASSERT_EQ(0, zero_mem[i]) << "Failed at allocation size " << size << " at byte " << i;
386 }
387 free(zero_mem);
388 }
389}
Elliott Hughes884f76e2016-02-10 20:43:22 -0800390
391TEST(malloc, malloc_0) {
392 void* p = malloc(0);
393 ASSERT_TRUE(p != nullptr);
394 free(p);
395}
396
397TEST(malloc, calloc_0_0) {
398 void* p = calloc(0, 0);
399 ASSERT_TRUE(p != nullptr);
400 free(p);
401}
402
403TEST(malloc, calloc_0_1) {
404 void* p = calloc(0, 1);
405 ASSERT_TRUE(p != nullptr);
406 free(p);
407}
408
409TEST(malloc, calloc_1_0) {
410 void* p = calloc(1, 0);
411 ASSERT_TRUE(p != nullptr);
412 free(p);
413}
414
415TEST(malloc, realloc_nullptr_0) {
416 // realloc(nullptr, size) is actually malloc(size).
417 void* p = realloc(nullptr, 0);
418 ASSERT_TRUE(p != nullptr);
419 free(p);
420}
421
422TEST(malloc, realloc_0) {
423 void* p = malloc(1024);
424 ASSERT_TRUE(p != nullptr);
425 // realloc(p, 0) is actually free(p).
426 void* p2 = realloc(p, 0);
427 ASSERT_TRUE(p2 == nullptr);
428}
Christopher Ferris72df6702016-02-11 15:51:31 -0800429
430constexpr size_t MAX_LOOPS = 200;
431
432// Make sure that memory returned by malloc is aligned to allow these data types.
433TEST(malloc, verify_alignment) {
434 uint32_t** values_32 = new uint32_t*[MAX_LOOPS];
435 uint64_t** values_64 = new uint64_t*[MAX_LOOPS];
436 long double** values_ldouble = new long double*[MAX_LOOPS];
437 // Use filler to attempt to force the allocator to get potentially bad alignments.
438 void** filler = new void*[MAX_LOOPS];
439
440 for (size_t i = 0; i < MAX_LOOPS; i++) {
441 // Check uint32_t pointers.
442 filler[i] = malloc(1);
443 ASSERT_TRUE(filler[i] != nullptr);
444
445 values_32[i] = reinterpret_cast<uint32_t*>(malloc(sizeof(uint32_t)));
446 ASSERT_TRUE(values_32[i] != nullptr);
447 *values_32[i] = i;
448 ASSERT_EQ(*values_32[i], i);
449 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_32[i]) & (sizeof(uint32_t) - 1));
450
451 free(filler[i]);
452 }
453
454 for (size_t i = 0; i < MAX_LOOPS; i++) {
455 // Check uint64_t pointers.
456 filler[i] = malloc(1);
457 ASSERT_TRUE(filler[i] != nullptr);
458
459 values_64[i] = reinterpret_cast<uint64_t*>(malloc(sizeof(uint64_t)));
460 ASSERT_TRUE(values_64[i] != nullptr);
461 *values_64[i] = 0x1000 + i;
462 ASSERT_EQ(*values_64[i], 0x1000 + i);
463 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_64[i]) & (sizeof(uint64_t) - 1));
464
465 free(filler[i]);
466 }
467
468 for (size_t i = 0; i < MAX_LOOPS; i++) {
469 // Check long double pointers.
470 filler[i] = malloc(1);
471 ASSERT_TRUE(filler[i] != nullptr);
472
473 values_ldouble[i] = reinterpret_cast<long double*>(malloc(sizeof(long double)));
474 ASSERT_TRUE(values_ldouble[i] != nullptr);
475 *values_ldouble[i] = 5.5 + i;
476 ASSERT_DOUBLE_EQ(*values_ldouble[i], 5.5 + i);
477 // 32 bit glibc has a long double size of 12 bytes, so hardcode the
478 // required alignment to 0x7.
479#if !defined(__BIONIC__) && !defined(__LP64__)
480 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_ldouble[i]) & 0x7);
481#else
482 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_ldouble[i]) & (sizeof(long double) - 1));
483#endif
484
485 free(filler[i]);
486 }
487
488 for (size_t i = 0; i < MAX_LOOPS; i++) {
489 free(values_32[i]);
490 free(values_64[i]);
491 free(values_ldouble[i]);
492 }
493
494 delete[] filler;
495 delete[] values_32;
496 delete[] values_64;
497 delete[] values_ldouble;
498}
Christopher Ferrisa1c0d2f2017-05-15 15:50:19 -0700499
500TEST(malloc, mallopt_smoke) {
501 errno = 0;
502 ASSERT_EQ(0, mallopt(-1000, 1));
503 // mallopt doesn't set errno.
504 ASSERT_EQ(0, errno);
505}
Elliott Hughesb1770852018-09-18 12:52:42 -0700506
507TEST(malloc, reallocarray_overflow) {
508#if HAVE_REALLOCARRAY
509 // Values that cause overflow to a result small enough (8 on LP64) that malloc would "succeed".
510 size_t a = static_cast<size_t>(INTPTR_MIN + 4);
511 size_t b = 2;
512
513 errno = 0;
514 ASSERT_TRUE(reallocarray(nullptr, a, b) == nullptr);
515 ASSERT_EQ(ENOMEM, errno);
516
517 errno = 0;
518 ASSERT_TRUE(reallocarray(nullptr, b, a) == nullptr);
519 ASSERT_EQ(ENOMEM, errno);
520#else
521 GTEST_LOG_(INFO) << "This test requires a C library with reallocarray.\n";
522#endif
523}
524
525TEST(malloc, reallocarray) {
526#if HAVE_REALLOCARRAY
527 void* p = reallocarray(nullptr, 2, 32);
528 ASSERT_TRUE(p != nullptr);
529 ASSERT_GE(malloc_usable_size(p), 64U);
530#else
531 GTEST_LOG_(INFO) << "This test requires a C library with reallocarray.\n";
532#endif
533}