xref: /aosp_15_r20/external/sandboxed-api/sandboxed_api/sandbox2/testcases/malloc.cc (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
1*ec63e07aSXin Li // Copyright 2019 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li //     https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li 
15*ec63e07aSXin Li // A binary doing various malloc calls to check that the malloc policy works as
16*ec63e07aSXin Li // expected.
17*ec63e07aSXin Li 
18*ec63e07aSXin Li #include <cstdlib>
19*ec63e07aSXin Li #include <vector>
20*ec63e07aSXin Li 
test()21*ec63e07aSXin Li void test() {
22*ec63e07aSXin Li   std::vector<void*> ptrs;
23*ec63e07aSXin Li 
24*ec63e07aSXin Li   for (size_t n = 1; n <= 0x1000000; n *= 2) {
25*ec63e07aSXin Li     void* buf = malloc(n);
26*ec63e07aSXin Li     if (buf == nullptr) {
27*ec63e07aSXin Li       exit(EXIT_FAILURE);
28*ec63e07aSXin Li     }
29*ec63e07aSXin Li     ptrs.push_back(buf);
30*ec63e07aSXin Li   }
31*ec63e07aSXin Li 
32*ec63e07aSXin Li   for (size_t n = 1; n <= 0x1000000; n *= 2) {
33*ec63e07aSXin Li     void* buf = calloc(5, n);
34*ec63e07aSXin Li     if (buf == nullptr) {
35*ec63e07aSXin Li       exit(EXIT_FAILURE);
36*ec63e07aSXin Li     }
37*ec63e07aSXin Li     ptrs.push_back(buf);
38*ec63e07aSXin Li   }
39*ec63e07aSXin Li 
40*ec63e07aSXin Li   for (int n = 0; n < ptrs.size(); n++) {
41*ec63e07aSXin Li     void* buf = realloc(ptrs[n], 100);
42*ec63e07aSXin Li     if (buf == nullptr) {
43*ec63e07aSXin Li       exit(EXIT_FAILURE);
44*ec63e07aSXin Li     }
45*ec63e07aSXin Li     ptrs[n] = buf;
46*ec63e07aSXin Li   }
47*ec63e07aSXin Li 
48*ec63e07aSXin Li   for (auto ptr : ptrs) {
49*ec63e07aSXin Li     free(ptr);
50*ec63e07aSXin Li   }
51*ec63e07aSXin Li   ptrs.clear();
52*ec63e07aSXin Li 
53*ec63e07aSXin Li   // Apply a bit of memory pressure, to trigger alternate allocator behaviors.
54*ec63e07aSXin Li   for (size_t n = 0; n < 0x200; n++) {
55*ec63e07aSXin Li     void* buf = malloc(0x400);
56*ec63e07aSXin Li     if (buf == nullptr) {
57*ec63e07aSXin Li       exit(EXIT_FAILURE);
58*ec63e07aSXin Li     }
59*ec63e07aSXin Li     ptrs.push_back(buf);
60*ec63e07aSXin Li   }
61*ec63e07aSXin Li 
62*ec63e07aSXin Li   for (auto ptr : ptrs) {
63*ec63e07aSXin Li     free(ptr);
64*ec63e07aSXin Li   }
65*ec63e07aSXin Li }
66*ec63e07aSXin Li 
main()67*ec63e07aSXin Li int main() {
68*ec63e07aSXin Li   test();
69*ec63e07aSXin Li   return EXIT_SUCCESS;
70*ec63e07aSXin Li }
71