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 <stdlib.h> 20 #include <malloc.h> 21 22 TEST(malloc, malloc_std) { 23 // Simple malloc test. 24 void *ptr = malloc(100); 25 ASSERT_TRUE(ptr != NULL); 26 ASSERT_LE(100U, malloc_usable_size(ptr)); 27 28 free(ptr); 29 } 30 31 TEST(malloc, calloc_std) { 32 // Simple calloc test. 33 size_t alloc_len = 100; 34 char *ptr = (char *)calloc(1, alloc_len); 35 ASSERT_TRUE(ptr != NULL); 36 ASSERT_LE(alloc_len, malloc_usable_size(ptr)); 37 for (size_t i = 0; i < alloc_len; i++) { 38 ASSERT_EQ(0, ptr[i]); 39 } 40 41 free(ptr); 42 } 43 44 TEST(malloc, memalign_multiple) { 45 // Memalign test where the alignment is any value. 46 for (size_t i = 0; i <= 12; i++) { 47 for (size_t alignment = 1 << i; alignment < (1U << (i+1)); alignment++) { 48 char *ptr = (char*)memalign(alignment, 100); 49 ASSERT_TRUE(ptr != NULL); 50 ASSERT_LE(100U, malloc_usable_size(ptr)); 51 ASSERT_EQ(0, (intptr_t)ptr % (1 << i)); 52 53 free(ptr); 54 } 55 } 56 } 57 58 TEST(malloc, memalign_realloc) { 59 // Memalign and then realloc the pointer a couple of times. 60 for (size_t alignment = 1; alignment <= 4096; alignment <<= 1) { 61 char *ptr = (char*)memalign(alignment, 100); 62 ASSERT_TRUE(ptr != NULL); 63 ASSERT_LE(100U, malloc_usable_size(ptr)); 64 ASSERT_EQ(0U, (intptr_t)ptr % alignment); 65 memset(ptr, 0x23, 100); 66 67 ptr = (char*)realloc(ptr, 200); 68 ASSERT_TRUE(ptr != NULL); 69 ASSERT_LE(200U, malloc_usable_size(ptr)); 70 ASSERT_TRUE(ptr != NULL); 71 for (size_t i = 0; i < 100; i++) { 72 ASSERT_EQ(0x23, ptr[i]); 73 } 74 memset(ptr, 0x45, 200); 75 76 ptr = (char*)realloc(ptr, 300); 77 ASSERT_TRUE(ptr != NULL); 78 ASSERT_LE(300U, malloc_usable_size(ptr)); 79 for (size_t i = 0; i < 200; i++) { 80 ASSERT_EQ(0x45, ptr[i]); 81 } 82 memset(ptr, 0x67, 300); 83 84 ptr = (char*)realloc(ptr, 250); 85 ASSERT_TRUE(ptr != NULL); 86 ASSERT_LE(250U, malloc_usable_size(ptr)); 87 for (size_t i = 0; i < 250; i++) { 88 ASSERT_EQ(0x67, ptr[i]); 89 } 90 91 free(ptr); 92 } 93 } 94 95 TEST(malloc, malloc_realloc_larger) { 96 // Realloc to a larger size, malloc is used for the original allocation. 97 char *ptr = (char *)malloc(100); 98 ASSERT_TRUE(ptr != NULL); 99 ASSERT_LE(100U, malloc_usable_size(ptr)); 100 memset(ptr, 67, 100); 101 102 ptr = (char *)realloc(ptr, 200); 103 ASSERT_TRUE(ptr != NULL); 104 ASSERT_LE(200U, malloc_usable_size(ptr)); 105 for (size_t i = 0; i < 100; i++) { 106 ASSERT_EQ(67, ptr[i]); 107 } 108 109 free(ptr); 110 } 111 112 TEST(malloc, malloc_realloc_smaller) { 113 // Realloc to a smaller size, malloc is used for the original allocation. 114 char *ptr = (char *)malloc(200); 115 ASSERT_TRUE(ptr != NULL); 116 ASSERT_LE(200U, malloc_usable_size(ptr)); 117 memset(ptr, 67, 200); 118 119 ptr = (char *)realloc(ptr, 100); 120 ASSERT_TRUE(ptr != NULL); 121 ASSERT_LE(100U, malloc_usable_size(ptr)); 122 for (size_t i = 0; i < 100; i++) { 123 ASSERT_EQ(67, ptr[i]); 124 } 125 126 free(ptr); 127 } 128 129 TEST(malloc, malloc_multiple_realloc) { 130 // Multiple reallocs, malloc is used for the original allocation. 131 char *ptr = (char *)malloc(200); 132 ASSERT_TRUE(ptr != NULL); 133 ASSERT_LE(200U, malloc_usable_size(ptr)); 134 memset(ptr, 0x23, 200); 135 136 ptr = (char *)realloc(ptr, 100); 137 ASSERT_TRUE(ptr != NULL); 138 ASSERT_LE(100U, malloc_usable_size(ptr)); 139 for (size_t i = 0; i < 100; i++) { 140 ASSERT_EQ(0x23, ptr[i]); 141 } 142 143 ptr = (char*)realloc(ptr, 50); 144 ASSERT_TRUE(ptr != NULL); 145 ASSERT_LE(50U, malloc_usable_size(ptr)); 146 for (size_t i = 0; i < 50; i++) { 147 ASSERT_EQ(0x23, ptr[i]); 148 } 149 150 ptr = (char*)realloc(ptr, 150); 151 ASSERT_TRUE(ptr != NULL); 152 ASSERT_LE(150U, malloc_usable_size(ptr)); 153 for (size_t i = 0; i < 50; i++) { 154 ASSERT_EQ(0x23, ptr[i]); 155 } 156 memset(ptr, 0x23, 150); 157 158 ptr = (char*)realloc(ptr, 425); 159 ASSERT_TRUE(ptr != NULL); 160 ASSERT_LE(425U, malloc_usable_size(ptr)); 161 for (size_t i = 0; i < 150; i++) { 162 ASSERT_EQ(0x23, ptr[i]); 163 } 164 165 free(ptr); 166 } 167 TEST(malloc, calloc_realloc_larger) { 168 // Realloc to a larger size, calloc is used for the original allocation. 169 char *ptr = (char *)calloc(1, 100); 170 ASSERT_TRUE(ptr != NULL); 171 ASSERT_LE(100U, malloc_usable_size(ptr)); 172 173 ptr = (char *)realloc(ptr, 200); 174 ASSERT_TRUE(ptr != NULL); 175 ASSERT_LE(200U, malloc_usable_size(ptr)); 176 for (size_t i = 0; i < 100; i++) { 177 ASSERT_EQ(0, ptr[i]); 178 } 179 180 free(ptr); 181 } 182 183 TEST(malloc, calloc_realloc_smaller) { 184 // Realloc to a smaller size, calloc is used for the original allocation. 185 char *ptr = (char *)calloc(1, 200); 186 ASSERT_TRUE(ptr != NULL); 187 ASSERT_LE(200U, malloc_usable_size(ptr)); 188 189 ptr = (char *)realloc(ptr, 100); 190 ASSERT_TRUE(ptr != NULL); 191 ASSERT_LE(100U, malloc_usable_size(ptr)); 192 for (size_t i = 0; i < 100; i++) { 193 ASSERT_EQ(0, ptr[i]); 194 } 195 196 free(ptr); 197 } 198 199 TEST(malloc, calloc_multiple_realloc) { 200 // Multiple reallocs, calloc is used for the original allocation. 201 char *ptr = (char *)calloc(1, 200); 202 ASSERT_TRUE(ptr != NULL); 203 ASSERT_LE(200U, malloc_usable_size(ptr)); 204 205 ptr = (char *)realloc(ptr, 100); 206 ASSERT_TRUE(ptr != NULL); 207 ASSERT_LE(100U, malloc_usable_size(ptr)); 208 for (size_t i = 0; i < 100; i++) { 209 ASSERT_EQ(0, ptr[i]); 210 } 211 212 ptr = (char*)realloc(ptr, 50); 213 ASSERT_TRUE(ptr != NULL); 214 ASSERT_LE(50U, malloc_usable_size(ptr)); 215 for (size_t i = 0; i < 50; i++) { 216 ASSERT_EQ(0, ptr[i]); 217 } 218 219 ptr = (char*)realloc(ptr, 150); 220 ASSERT_TRUE(ptr != NULL); 221 ASSERT_LE(150U, malloc_usable_size(ptr)); 222 for (size_t i = 0; i < 50; i++) { 223 ASSERT_EQ(0, ptr[i]); 224 } 225 memset(ptr, 0, 150); 226 227 ptr = (char*)realloc(ptr, 425); 228 ASSERT_TRUE(ptr != NULL); 229 ASSERT_LE(425U, malloc_usable_size(ptr)); 230 for (size_t i = 0; i < 150; i++) { 231 ASSERT_EQ(0, ptr[i]); 232 } 233 234 free(ptr); 235 } 236