blob: ed98f15d3d34697af4b0e08527a0786619d77c39 [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
25TEST(malloc, malloc_std) {
26 // Simple malloc test.
27 void *ptr = malloc(100);
28 ASSERT_TRUE(ptr != NULL);
29 ASSERT_LE(100U, malloc_usable_size(ptr));
Christopher Ferris885f3b92013-05-21 17:48:01 -070030 free(ptr);
31}
32
Christopher Ferrisa4037802014-06-09 19:14:11 -070033TEST(malloc, malloc_overflow) {
34 errno = 0;
35 ASSERT_EQ(NULL, malloc(SIZE_MAX));
36 ASSERT_EQ(ENOMEM, errno);
37}
38
Christopher Ferris885f3b92013-05-21 17:48:01 -070039TEST(malloc, calloc_std) {
40 // Simple calloc test.
41 size_t alloc_len = 100;
42 char *ptr = (char *)calloc(1, alloc_len);
43 ASSERT_TRUE(ptr != NULL);
44 ASSERT_LE(alloc_len, malloc_usable_size(ptr));
45 for (size_t i = 0; i < alloc_len; i++) {
46 ASSERT_EQ(0, ptr[i]);
47 }
Christopher Ferris885f3b92013-05-21 17:48:01 -070048 free(ptr);
49}
50
Christopher Ferrisa4037802014-06-09 19:14:11 -070051TEST(malloc, calloc_illegal) {
52 errno = 0;
53 ASSERT_EQ(NULL, calloc(-1, 100));
54 ASSERT_EQ(ENOMEM, errno);
55}
56
57TEST(malloc, calloc_overflow) {
58 errno = 0;
59 ASSERT_EQ(NULL, calloc(1, SIZE_MAX));
60 ASSERT_EQ(ENOMEM, errno);
61 errno = 0;
62 ASSERT_EQ(NULL, calloc(SIZE_MAX, SIZE_MAX));
63 ASSERT_EQ(ENOMEM, errno);
64 errno = 0;
65 ASSERT_EQ(NULL, calloc(2, SIZE_MAX));
66 ASSERT_EQ(ENOMEM, errno);
67 errno = 0;
68 ASSERT_EQ(NULL, calloc(SIZE_MAX, 2));
69 ASSERT_EQ(ENOMEM, errno);
70}
71
Christopher Ferris885f3b92013-05-21 17:48:01 -070072TEST(malloc, memalign_multiple) {
73 // Memalign test where the alignment is any value.
74 for (size_t i = 0; i <= 12; i++) {
75 for (size_t alignment = 1 << i; alignment < (1U << (i+1)); alignment++) {
Christopher Ferrisa4037802014-06-09 19:14:11 -070076 char *ptr = reinterpret_cast<char*>(memalign(alignment, 100));
77 ASSERT_TRUE(ptr != NULL) << "Failed at alignment " << alignment;
78 ASSERT_LE(100U, malloc_usable_size(ptr)) << "Failed at alignment " << alignment;
79 ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % ((1U << i)))
80 << "Failed at alignment " << alignment;
Christopher Ferris885f3b92013-05-21 17:48:01 -070081 free(ptr);
82 }
83 }
84}
85
Christopher Ferrisa4037802014-06-09 19:14:11 -070086TEST(malloc, memalign_overflow) {
87 ASSERT_EQ(NULL, memalign(4096, SIZE_MAX));
88}
89
90TEST(malloc, memalign_non_power2) {
91 void* ptr;
92 for (size_t align = 0; align <= 256; align++) {
93 ptr = memalign(align, 1024);
94 ASSERT_TRUE(ptr != NULL) << "Failed at align " << align;
95 free(ptr);
96 }
97}
98
99TEST(malloc, posix_memalign_non_power2) {
100 void* ptr;
101 ASSERT_EQ(EINVAL, posix_memalign(&ptr, 17, 1024));
102}
103
104TEST(malloc, posix_memalign_overflow) {
105 void* ptr;
106 ASSERT_NE(0, posix_memalign(&ptr, 16, SIZE_MAX));
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);
113 ASSERT_TRUE(ptr != NULL);
114 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);
119 ASSERT_TRUE(ptr != NULL);
120 ASSERT_LE(200U, malloc_usable_size(ptr));
121 ASSERT_TRUE(ptr != NULL);
122 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);
128 ASSERT_TRUE(ptr != NULL);
129 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);
136 ASSERT_TRUE(ptr != NULL);
137 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);
148 ASSERT_TRUE(ptr != NULL);
149 ASSERT_LE(100U, malloc_usable_size(ptr));
150 memset(ptr, 67, 100);
151
152 ptr = (char *)realloc(ptr, 200);
153 ASSERT_TRUE(ptr != NULL);
154 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);
164 ASSERT_TRUE(ptr != NULL);
165 ASSERT_LE(200U, malloc_usable_size(ptr));
166 memset(ptr, 67, 200);
167
168 ptr = (char *)realloc(ptr, 100);
169 ASSERT_TRUE(ptr != NULL);
170 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);
180 ASSERT_TRUE(ptr != NULL);
181 ASSERT_LE(200U, malloc_usable_size(ptr));
182 memset(ptr, 0x23, 200);
183
184 ptr = (char *)realloc(ptr, 100);
185 ASSERT_TRUE(ptr != NULL);
186 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);
192 ASSERT_TRUE(ptr != NULL);
193 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);
199 ASSERT_TRUE(ptr != NULL);
200 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);
207 ASSERT_TRUE(ptr != NULL);
208 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);
218 ASSERT_TRUE(ptr != NULL);
219 ASSERT_LE(100U, malloc_usable_size(ptr));
220
221 ptr = (char *)realloc(ptr, 200);
222 ASSERT_TRUE(ptr != NULL);
223 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);
233 ASSERT_TRUE(ptr != NULL);
234 ASSERT_LE(200U, malloc_usable_size(ptr));
235
236 ptr = (char *)realloc(ptr, 100);
237 ASSERT_TRUE(ptr != NULL);
238 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);
248 ASSERT_TRUE(ptr != NULL);
249 ASSERT_LE(200U, malloc_usable_size(ptr));
250
251 ptr = (char *)realloc(ptr, 100);
252 ASSERT_TRUE(ptr != NULL);
253 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);
259 ASSERT_TRUE(ptr != NULL);
260 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);
266 ASSERT_TRUE(ptr != NULL);
267 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);
274 ASSERT_TRUE(ptr != NULL);
275 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;
284 ASSERT_EQ(NULL, realloc(NULL, SIZE_MAX));
285 ASSERT_EQ(ENOMEM, errno);
286 void* ptr = malloc(100);
287 ASSERT_TRUE(ptr != NULL);
288 errno = 0;
289 ASSERT_EQ(NULL, realloc(ptr, SIZE_MAX));
290 ASSERT_EQ(ENOMEM, errno);
291 free(ptr);
Christopher Ferris72bbd422014-05-08 11:14:03 -0700292}
293
Christopher Ferrisa4037802014-06-09 19:14:11 -0700294TEST(malloc, pvalloc_std) {
295 size_t pagesize = sysconf(_SC_PAGESIZE);
296 void* ptr = pvalloc(100);
297 ASSERT_TRUE(ptr != NULL);
298 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0);
299 ASSERT_LE(pagesize, malloc_usable_size(ptr));
300 free(ptr);
301}
302
303TEST(malloc, pvalloc_overflow) {
304 ASSERT_EQ(NULL, pvalloc(SIZE_MAX));
305}
306
307TEST(malloc, valloc_std) {
308 size_t pagesize = sysconf(_SC_PAGESIZE);
309 void* ptr = pvalloc(100);
310 ASSERT_TRUE(ptr != NULL);
311 ASSERT_TRUE((reinterpret_cast<uintptr_t>(ptr) & (pagesize-1)) == 0);
312 free(ptr);
313}
314
315TEST(malloc, valloc_overflow) {
316 ASSERT_EQ(NULL, valloc(SIZE_MAX));
Christopher Ferris72bbd422014-05-08 11:14:03 -0700317}