blob: 8b670f0e5e63a6fbbb653ea1ddbd3c724943514d [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"
Evgenii Stepanovacd6f4f2018-11-06 16:48:27 -080028#include "utils.h"
Dan Alberte5fdaa42014-06-14 01:04:31 +000029
Elliott Hughesb1770852018-09-18 12:52:42 -070030#if defined(__BIONIC__)
31#define HAVE_REALLOCARRAY 1
32#else
33#define HAVE_REALLOCARRAY __GLIBC_PREREQ(2, 26)
34#endif
35
Christopher Ferris885f3b92013-05-21 17:48:01 -070036TEST(malloc, malloc_std) {
37 // Simple malloc test.
38 void *ptr = malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -070039 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -070040 ASSERT_LE(100U, malloc_usable_size(ptr));
Christopher Ferris885f3b92013-05-21 17:48:01 -070041 free(ptr);
42}
43
Christopher Ferrisa4037802014-06-09 19:14:11 -070044TEST(malloc, malloc_overflow) {
Evgenii Stepanovacd6f4f2018-11-06 16:48:27 -080045 SKIP_WITH_HWASAN;
Christopher Ferrisa4037802014-06-09 19:14:11 -070046 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070047 ASSERT_EQ(nullptr, malloc(SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070048 ASSERT_EQ(ENOMEM, errno);
49}
50
Christopher Ferris885f3b92013-05-21 17:48:01 -070051TEST(malloc, calloc_std) {
52 // Simple calloc test.
53 size_t alloc_len = 100;
54 char *ptr = (char *)calloc(1, alloc_len);
Yi Kong32bc0fc2018-08-02 17:31:13 -070055 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -070056 ASSERT_LE(alloc_len, malloc_usable_size(ptr));
57 for (size_t i = 0; i < alloc_len; i++) {
58 ASSERT_EQ(0, ptr[i]);
59 }
Christopher Ferris885f3b92013-05-21 17:48:01 -070060 free(ptr);
61}
62
Christopher Ferrisa4037802014-06-09 19:14:11 -070063TEST(malloc, calloc_illegal) {
Evgenii Stepanovacd6f4f2018-11-06 16:48:27 -080064 SKIP_WITH_HWASAN;
Christopher Ferrisa4037802014-06-09 19:14:11 -070065 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070066 ASSERT_EQ(nullptr, calloc(-1, 100));
Christopher Ferrisa4037802014-06-09 19:14:11 -070067 ASSERT_EQ(ENOMEM, errno);
68}
69
70TEST(malloc, calloc_overflow) {
Evgenii Stepanovacd6f4f2018-11-06 16:48:27 -080071 SKIP_WITH_HWASAN;
Christopher Ferrisa4037802014-06-09 19:14:11 -070072 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070073 ASSERT_EQ(nullptr, calloc(1, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070074 ASSERT_EQ(ENOMEM, errno);
75 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070076 ASSERT_EQ(nullptr, calloc(SIZE_MAX, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070077 ASSERT_EQ(ENOMEM, errno);
78 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070079 ASSERT_EQ(nullptr, calloc(2, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -070080 ASSERT_EQ(ENOMEM, errno);
81 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -070082 ASSERT_EQ(nullptr, calloc(SIZE_MAX, 2));
Christopher Ferrisa4037802014-06-09 19:14:11 -070083 ASSERT_EQ(ENOMEM, errno);
84}
85
Christopher Ferris885f3b92013-05-21 17:48:01 -070086TEST(malloc, memalign_multiple) {
Evgenii Stepanovacd6f4f2018-11-06 16:48:27 -080087 SKIP_WITH_HWASAN; // hwasan requires power of 2 alignment.
Christopher Ferris885f3b92013-05-21 17:48:01 -070088 // Memalign test where the alignment is any value.
89 for (size_t i = 0; i <= 12; i++) {
90 for (size_t alignment = 1 << i; alignment < (1U << (i+1)); alignment++) {
Christopher Ferrisa4037802014-06-09 19:14:11 -070091 char *ptr = reinterpret_cast<char*>(memalign(alignment, 100));
Yi Kong32bc0fc2018-08-02 17:31:13 -070092 ASSERT_TRUE(ptr != nullptr) << "Failed at alignment " << alignment;
Christopher Ferrisa4037802014-06-09 19:14:11 -070093 ASSERT_LE(100U, malloc_usable_size(ptr)) << "Failed at alignment " << alignment;
94 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % ((1U << i)))
95 << "Failed at alignment " << alignment;
Christopher Ferris885f3b92013-05-21 17:48:01 -070096 free(ptr);
97 }
98 }
99}
100
Christopher Ferrisa4037802014-06-09 19:14:11 -0700101TEST(malloc, memalign_overflow) {
Evgenii Stepanovacd6f4f2018-11-06 16:48:27 -0800102 SKIP_WITH_HWASAN;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700103 ASSERT_EQ(nullptr, memalign(4096, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700104}
105
106TEST(malloc, memalign_non_power2) {
Evgenii Stepanovacd6f4f2018-11-06 16:48:27 -0800107 SKIP_WITH_HWASAN;
Christopher Ferrisa4037802014-06-09 19:14:11 -0700108 void* ptr;
109 for (size_t align = 0; align <= 256; align++) {
110 ptr = memalign(align, 1024);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700111 ASSERT_TRUE(ptr != nullptr) << "Failed at align " << align;
Christopher Ferrisa4037802014-06-09 19:14:11 -0700112 free(ptr);
113 }
114}
115
Christopher Ferris885f3b92013-05-21 17:48:01 -0700116TEST(malloc, memalign_realloc) {
117 // Memalign and then realloc the pointer a couple of times.
118 for (size_t alignment = 1; alignment <= 4096; alignment <<= 1) {
119 char *ptr = (char*)memalign(alignment, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700120 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700121 ASSERT_LE(100U, malloc_usable_size(ptr));
122 ASSERT_EQ(0U, (intptr_t)ptr % alignment);
123 memset(ptr, 0x23, 100);
124
125 ptr = (char*)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700126 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700127 ASSERT_LE(200U, malloc_usable_size(ptr));
Yi Kong32bc0fc2018-08-02 17:31:13 -0700128 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700129 for (size_t i = 0; i < 100; i++) {
130 ASSERT_EQ(0x23, ptr[i]);
131 }
132 memset(ptr, 0x45, 200);
133
134 ptr = (char*)realloc(ptr, 300);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700135 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700136 ASSERT_LE(300U, malloc_usable_size(ptr));
137 for (size_t i = 0; i < 200; i++) {
138 ASSERT_EQ(0x45, ptr[i]);
139 }
140 memset(ptr, 0x67, 300);
141
142 ptr = (char*)realloc(ptr, 250);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700143 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700144 ASSERT_LE(250U, malloc_usable_size(ptr));
145 for (size_t i = 0; i < 250; i++) {
146 ASSERT_EQ(0x67, ptr[i]);
147 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700148 free(ptr);
149 }
150}
151
152TEST(malloc, malloc_realloc_larger) {
153 // Realloc to a larger size, malloc is used for the original allocation.
154 char *ptr = (char *)malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700155 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700156 ASSERT_LE(100U, malloc_usable_size(ptr));
157 memset(ptr, 67, 100);
158
159 ptr = (char *)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700160 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700161 ASSERT_LE(200U, malloc_usable_size(ptr));
162 for (size_t i = 0; i < 100; i++) {
163 ASSERT_EQ(67, ptr[i]);
164 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700165 free(ptr);
166}
167
168TEST(malloc, malloc_realloc_smaller) {
169 // Realloc to a smaller size, malloc is used for the original allocation.
170 char *ptr = (char *)malloc(200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700171 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700172 ASSERT_LE(200U, malloc_usable_size(ptr));
173 memset(ptr, 67, 200);
174
175 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700176 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700177 ASSERT_LE(100U, malloc_usable_size(ptr));
178 for (size_t i = 0; i < 100; i++) {
179 ASSERT_EQ(67, ptr[i]);
180 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700181 free(ptr);
182}
183
184TEST(malloc, malloc_multiple_realloc) {
185 // Multiple reallocs, malloc is used for the original allocation.
186 char *ptr = (char *)malloc(200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700187 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700188 ASSERT_LE(200U, malloc_usable_size(ptr));
189 memset(ptr, 0x23, 200);
190
191 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700192 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700193 ASSERT_LE(100U, malloc_usable_size(ptr));
194 for (size_t i = 0; i < 100; i++) {
195 ASSERT_EQ(0x23, ptr[i]);
196 }
197
198 ptr = (char*)realloc(ptr, 50);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700199 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700200 ASSERT_LE(50U, malloc_usable_size(ptr));
201 for (size_t i = 0; i < 50; i++) {
202 ASSERT_EQ(0x23, ptr[i]);
203 }
204
205 ptr = (char*)realloc(ptr, 150);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700206 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700207 ASSERT_LE(150U, malloc_usable_size(ptr));
208 for (size_t i = 0; i < 50; i++) {
209 ASSERT_EQ(0x23, ptr[i]);
210 }
211 memset(ptr, 0x23, 150);
212
213 ptr = (char*)realloc(ptr, 425);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700214 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700215 ASSERT_LE(425U, malloc_usable_size(ptr));
216 for (size_t i = 0; i < 150; i++) {
217 ASSERT_EQ(0x23, ptr[i]);
218 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700219 free(ptr);
220}
Christopher Ferrisa4037802014-06-09 19:14:11 -0700221
Christopher Ferris885f3b92013-05-21 17:48:01 -0700222TEST(malloc, calloc_realloc_larger) {
223 // Realloc to a larger size, calloc is used for the original allocation.
224 char *ptr = (char *)calloc(1, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700225 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700226 ASSERT_LE(100U, malloc_usable_size(ptr));
227
228 ptr = (char *)realloc(ptr, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700229 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700230 ASSERT_LE(200U, malloc_usable_size(ptr));
231 for (size_t i = 0; i < 100; i++) {
232 ASSERT_EQ(0, ptr[i]);
233 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700234 free(ptr);
235}
236
237TEST(malloc, calloc_realloc_smaller) {
238 // Realloc to a smaller size, calloc is used for the original allocation.
239 char *ptr = (char *)calloc(1, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700240 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700241 ASSERT_LE(200U, malloc_usable_size(ptr));
242
243 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700244 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700245 ASSERT_LE(100U, malloc_usable_size(ptr));
246 for (size_t i = 0; i < 100; i++) {
247 ASSERT_EQ(0, ptr[i]);
248 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700249 free(ptr);
250}
251
252TEST(malloc, calloc_multiple_realloc) {
253 // Multiple reallocs, calloc is used for the original allocation.
254 char *ptr = (char *)calloc(1, 200);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700255 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700256 ASSERT_LE(200U, malloc_usable_size(ptr));
257
258 ptr = (char *)realloc(ptr, 100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700259 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700260 ASSERT_LE(100U, malloc_usable_size(ptr));
261 for (size_t i = 0; i < 100; i++) {
262 ASSERT_EQ(0, ptr[i]);
263 }
264
265 ptr = (char*)realloc(ptr, 50);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700266 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700267 ASSERT_LE(50U, malloc_usable_size(ptr));
268 for (size_t i = 0; i < 50; i++) {
269 ASSERT_EQ(0, ptr[i]);
270 }
271
272 ptr = (char*)realloc(ptr, 150);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700273 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700274 ASSERT_LE(150U, malloc_usable_size(ptr));
275 for (size_t i = 0; i < 50; i++) {
276 ASSERT_EQ(0, ptr[i]);
277 }
278 memset(ptr, 0, 150);
279
280 ptr = (char*)realloc(ptr, 425);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700281 ASSERT_TRUE(ptr != nullptr);
Christopher Ferris885f3b92013-05-21 17:48:01 -0700282 ASSERT_LE(425U, malloc_usable_size(ptr));
283 for (size_t i = 0; i < 150; i++) {
284 ASSERT_EQ(0, ptr[i]);
285 }
Christopher Ferris885f3b92013-05-21 17:48:01 -0700286 free(ptr);
287}
Christopher Ferris72bbd422014-05-08 11:14:03 -0700288
Christopher Ferrisa4037802014-06-09 19:14:11 -0700289TEST(malloc, realloc_overflow) {
Evgenii Stepanovacd6f4f2018-11-06 16:48:27 -0800290 SKIP_WITH_HWASAN;
Christopher Ferrisa4037802014-06-09 19:14:11 -0700291 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700292 ASSERT_EQ(nullptr, realloc(nullptr, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700293 ASSERT_EQ(ENOMEM, errno);
294 void* ptr = malloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700295 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700296 errno = 0;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700297 ASSERT_EQ(nullptr, realloc(ptr, SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700298 ASSERT_EQ(ENOMEM, errno);
299 free(ptr);
Christopher Ferris72bbd422014-05-08 11:14:03 -0700300}
301
Dan Alberte5fdaa42014-06-14 01:04:31 +0000302#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
303extern "C" void* pvalloc(size_t);
304extern "C" void* valloc(size_t);
305
Christopher Ferrisa4037802014-06-09 19:14:11 -0700306TEST(malloc, pvalloc_std) {
307 size_t pagesize = sysconf(_SC_PAGESIZE);
308 void* ptr = pvalloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700309 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700310 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0);
311 ASSERT_LE(pagesize, malloc_usable_size(ptr));
312 free(ptr);
313}
314
315TEST(malloc, pvalloc_overflow) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700316 ASSERT_EQ(nullptr, pvalloc(SIZE_MAX));
Christopher Ferrisa4037802014-06-09 19:14:11 -0700317}
318
319TEST(malloc, valloc_std) {
320 size_t pagesize = sysconf(_SC_PAGESIZE);
321 void* ptr = pvalloc(100);
Yi Kong32bc0fc2018-08-02 17:31:13 -0700322 ASSERT_TRUE(ptr != nullptr);
Christopher Ferrisa4037802014-06-09 19:14:11 -0700323 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0);
324 free(ptr);
325}
326
327TEST(malloc, valloc_overflow) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700328 ASSERT_EQ(nullptr, valloc(SIZE_MAX));
Christopher Ferris72bbd422014-05-08 11:14:03 -0700329}
Dan Alberte5fdaa42014-06-14 01:04:31 +0000330#endif
Dan Albert4caa1f02014-08-20 09:16:57 -0700331
332TEST(malloc, malloc_info) {
333#ifdef __BIONIC__
334 char* buf;
335 size_t bufsize;
336 FILE* memstream = open_memstream(&buf, &bufsize);
337 ASSERT_NE(nullptr, memstream);
338 ASSERT_EQ(0, malloc_info(0, memstream));
339 ASSERT_EQ(0, fclose(memstream));
340
341 tinyxml2::XMLDocument doc;
342 ASSERT_EQ(tinyxml2::XML_SUCCESS, doc.Parse(buf));
343
344 auto root = doc.FirstChildElement();
345 ASSERT_NE(nullptr, root);
346 ASSERT_STREQ("malloc", root->Name());
347 ASSERT_STREQ("jemalloc-1", root->Attribute("version"));
348
349 auto arena = root->FirstChildElement();
350 for (; arena != nullptr; arena = arena->NextSiblingElement()) {
351 int val;
352
353 ASSERT_STREQ("heap", arena->Name());
354 ASSERT_EQ(tinyxml2::XML_SUCCESS, arena->QueryIntAttribute("nr", &val));
355 ASSERT_EQ(tinyxml2::XML_SUCCESS,
356 arena->FirstChildElement("allocated-large")->QueryIntText(&val));
357 ASSERT_EQ(tinyxml2::XML_SUCCESS,
358 arena->FirstChildElement("allocated-huge")->QueryIntText(&val));
359 ASSERT_EQ(tinyxml2::XML_SUCCESS,
360 arena->FirstChildElement("allocated-bins")->QueryIntText(&val));
361 ASSERT_EQ(tinyxml2::XML_SUCCESS,
362 arena->FirstChildElement("bins-total")->QueryIntText(&val));
363
364 auto bin = arena->FirstChildElement("bin");
365 for (; bin != nullptr; bin = bin ->NextSiblingElement()) {
366 if (strcmp(bin->Name(), "bin") == 0) {
367 ASSERT_EQ(tinyxml2::XML_SUCCESS, bin->QueryIntAttribute("nr", &val));
368 ASSERT_EQ(tinyxml2::XML_SUCCESS,
369 bin->FirstChildElement("allocated")->QueryIntText(&val));
370 ASSERT_EQ(tinyxml2::XML_SUCCESS,
371 bin->FirstChildElement("nmalloc")->QueryIntText(&val));
372 ASSERT_EQ(tinyxml2::XML_SUCCESS,
373 bin->FirstChildElement("ndalloc")->QueryIntText(&val));
374 }
375 }
376 }
377#endif
378}
Christopher Ferrisad33ebe2015-12-16 12:07:25 -0800379
380TEST(malloc, calloc_usable_size) {
381 for (size_t size = 1; size <= 2048; size++) {
382 void* pointer = malloc(size);
383 ASSERT_TRUE(pointer != nullptr);
384 memset(pointer, 0xeb, malloc_usable_size(pointer));
385 free(pointer);
386
387 // We should get a previous pointer that has been set to non-zero.
388 // If calloc does not zero out all of the data, this will fail.
389 uint8_t* zero_mem = reinterpret_cast<uint8_t*>(calloc(1, size));
390 ASSERT_TRUE(pointer != nullptr);
391 size_t usable_size = malloc_usable_size(zero_mem);
392 for (size_t i = 0; i < usable_size; i++) {
393 ASSERT_EQ(0, zero_mem[i]) << "Failed at allocation size " << size << " at byte " << i;
394 }
395 free(zero_mem);
396 }
397}
Elliott Hughes884f76e2016-02-10 20:43:22 -0800398
399TEST(malloc, malloc_0) {
400 void* p = malloc(0);
401 ASSERT_TRUE(p != nullptr);
402 free(p);
403}
404
405TEST(malloc, calloc_0_0) {
406 void* p = calloc(0, 0);
407 ASSERT_TRUE(p != nullptr);
408 free(p);
409}
410
411TEST(malloc, calloc_0_1) {
412 void* p = calloc(0, 1);
413 ASSERT_TRUE(p != nullptr);
414 free(p);
415}
416
417TEST(malloc, calloc_1_0) {
418 void* p = calloc(1, 0);
419 ASSERT_TRUE(p != nullptr);
420 free(p);
421}
422
423TEST(malloc, realloc_nullptr_0) {
424 // realloc(nullptr, size) is actually malloc(size).
425 void* p = realloc(nullptr, 0);
426 ASSERT_TRUE(p != nullptr);
427 free(p);
428}
429
430TEST(malloc, realloc_0) {
431 void* p = malloc(1024);
432 ASSERT_TRUE(p != nullptr);
433 // realloc(p, 0) is actually free(p).
434 void* p2 = realloc(p, 0);
435 ASSERT_TRUE(p2 == nullptr);
436}
Christopher Ferris72df6702016-02-11 15:51:31 -0800437
438constexpr size_t MAX_LOOPS = 200;
439
440// Make sure that memory returned by malloc is aligned to allow these data types.
441TEST(malloc, verify_alignment) {
442 uint32_t** values_32 = new uint32_t*[MAX_LOOPS];
443 uint64_t** values_64 = new uint64_t*[MAX_LOOPS];
444 long double** values_ldouble = new long double*[MAX_LOOPS];
445 // Use filler to attempt to force the allocator to get potentially bad alignments.
446 void** filler = new void*[MAX_LOOPS];
447
448 for (size_t i = 0; i < MAX_LOOPS; i++) {
449 // Check uint32_t pointers.
450 filler[i] = malloc(1);
451 ASSERT_TRUE(filler[i] != nullptr);
452
453 values_32[i] = reinterpret_cast<uint32_t*>(malloc(sizeof(uint32_t)));
454 ASSERT_TRUE(values_32[i] != nullptr);
455 *values_32[i] = i;
456 ASSERT_EQ(*values_32[i], i);
457 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_32[i]) & (sizeof(uint32_t) - 1));
458
459 free(filler[i]);
460 }
461
462 for (size_t i = 0; i < MAX_LOOPS; i++) {
463 // Check uint64_t pointers.
464 filler[i] = malloc(1);
465 ASSERT_TRUE(filler[i] != nullptr);
466
467 values_64[i] = reinterpret_cast<uint64_t*>(malloc(sizeof(uint64_t)));
468 ASSERT_TRUE(values_64[i] != nullptr);
469 *values_64[i] = 0x1000 + i;
470 ASSERT_EQ(*values_64[i], 0x1000 + i);
471 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_64[i]) & (sizeof(uint64_t) - 1));
472
473 free(filler[i]);
474 }
475
476 for (size_t i = 0; i < MAX_LOOPS; i++) {
477 // Check long double pointers.
478 filler[i] = malloc(1);
479 ASSERT_TRUE(filler[i] != nullptr);
480
481 values_ldouble[i] = reinterpret_cast<long double*>(malloc(sizeof(long double)));
482 ASSERT_TRUE(values_ldouble[i] != nullptr);
483 *values_ldouble[i] = 5.5 + i;
484 ASSERT_DOUBLE_EQ(*values_ldouble[i], 5.5 + i);
485 // 32 bit glibc has a long double size of 12 bytes, so hardcode the
486 // required alignment to 0x7.
487#if !defined(__BIONIC__) && !defined(__LP64__)
488 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_ldouble[i]) & 0x7);
489#else
490 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_ldouble[i]) & (sizeof(long double) - 1));
491#endif
492
493 free(filler[i]);
494 }
495
496 for (size_t i = 0; i < MAX_LOOPS; i++) {
497 free(values_32[i]);
498 free(values_64[i]);
499 free(values_ldouble[i]);
500 }
501
502 delete[] filler;
503 delete[] values_32;
504 delete[] values_64;
505 delete[] values_ldouble;
506}
Christopher Ferrisa1c0d2f2017-05-15 15:50:19 -0700507
508TEST(malloc, mallopt_smoke) {
509 errno = 0;
510 ASSERT_EQ(0, mallopt(-1000, 1));
511 // mallopt doesn't set errno.
512 ASSERT_EQ(0, errno);
513}
Elliott Hughesb1770852018-09-18 12:52:42 -0700514
Christopher Ferrisaf1b8dd2018-11-07 15:28:16 -0800515TEST(malloc, mallopt_decay) {
516#if defined(__BIONIC__)
517 errno = 0;
518 ASSERT_EQ(1, mallopt(M_DECAY_TIME, 1));
519 ASSERT_EQ(1, mallopt(M_DECAY_TIME, 0));
520 ASSERT_EQ(1, mallopt(M_DECAY_TIME, 1));
521 ASSERT_EQ(1, mallopt(M_DECAY_TIME, 0));
522#else
523 GTEST_LOG_(INFO) << "This tests a bionic implementation detail.\n";
524#endif
525}
526
527TEST(malloc, mallopt_purge) {
528#if defined(__BIONIC__)
529 errno = 0;
530 ASSERT_EQ(1, mallopt(M_PURGE, 0));
531#else
532 GTEST_LOG_(INFO) << "This tests a bionic implementation detail.\n";
533#endif
534}
535
Elliott Hughesb1770852018-09-18 12:52:42 -0700536TEST(malloc, reallocarray_overflow) {
537#if HAVE_REALLOCARRAY
538 // Values that cause overflow to a result small enough (8 on LP64) that malloc would "succeed".
539 size_t a = static_cast<size_t>(INTPTR_MIN + 4);
540 size_t b = 2;
541
542 errno = 0;
543 ASSERT_TRUE(reallocarray(nullptr, a, b) == nullptr);
544 ASSERT_EQ(ENOMEM, errno);
545
546 errno = 0;
547 ASSERT_TRUE(reallocarray(nullptr, b, a) == nullptr);
548 ASSERT_EQ(ENOMEM, errno);
549#else
550 GTEST_LOG_(INFO) << "This test requires a C library with reallocarray.\n";
551#endif
552}
553
554TEST(malloc, reallocarray) {
555#if HAVE_REALLOCARRAY
556 void* p = reallocarray(nullptr, 2, 32);
557 ASSERT_TRUE(p != nullptr);
558 ASSERT_GE(malloc_usable_size(p), 64U);
559#else
560 GTEST_LOG_(INFO) << "This test requires a C library with reallocarray.\n";
561#endif
562}