xref: /llvm-project/compiler-rt/test/asan/TestCases/Linux/release_to_os_test.cpp (revision 673dc3d4a0b0fbb3b9b34ae2ecbfa522627fe582)
1*673dc3d4SNico Weber // Tests ASAN_OPTIONS=allocator_release_to_os=1
2*673dc3d4SNico Weber 
3*673dc3d4SNico Weber // RUN: %clangxx_asan -std=c++11 %s -o %t
4*673dc3d4SNico Weber // RUN: %env_asan_opts=allocator_release_to_os_interval_ms=0 %run %t 2>&1 | FileCheck %s --check-prefix=RELEASE
5*673dc3d4SNico Weber // RUN: %env_asan_opts=allocator_release_to_os_interval_ms=-1 %run %t 2>&1 | FileCheck %s --check-prefix=NO_RELEASE
6*673dc3d4SNico Weber // RUN: %env_asan_opts=allocator_release_to_os_interval_ms=-1 %run %t force 2>&1 | FileCheck %s --check-prefix=FORCE_RELEASE
7*673dc3d4SNico Weber 
8*673dc3d4SNico Weber // REQUIRES: x86_64-target-arch
9*673dc3d4SNico Weber 
10*673dc3d4SNico Weber #include <algorithm>
11*673dc3d4SNico Weber #include <assert.h>
12*673dc3d4SNico Weber #include <random>
13*673dc3d4SNico Weber #include <stdint.h>
14*673dc3d4SNico Weber #include <stdio.h>
15*673dc3d4SNico Weber #include <stdlib.h>
16*673dc3d4SNico Weber #include <string.h>
17*673dc3d4SNico Weber 
18*673dc3d4SNico Weber #include <sanitizer/allocator_interface.h>
19*673dc3d4SNico Weber #include <sanitizer/asan_interface.h>
20*673dc3d4SNico Weber 
MallocReleaseStress()21*673dc3d4SNico Weber void MallocReleaseStress() {
22*673dc3d4SNico Weber   const size_t kNumChunks = 10000;
23*673dc3d4SNico Weber   const size_t kAllocSize = 100;
24*673dc3d4SNico Weber   const size_t kNumIter = 100;
25*673dc3d4SNico Weber   uintptr_t *chunks[kNumChunks] = {0};
26*673dc3d4SNico Weber   std::mt19937 r;
27*673dc3d4SNico Weber 
28*673dc3d4SNico Weber   for (size_t iter = 0; iter < kNumIter; iter++) {
29*673dc3d4SNico Weber     std::shuffle(chunks, chunks + kNumChunks, r);
30*673dc3d4SNico Weber     size_t to_replace = rand() % kNumChunks;
31*673dc3d4SNico Weber     for (size_t i = 0; i < kNumChunks; i++) {
32*673dc3d4SNico Weber       if (chunks[i])
33*673dc3d4SNico Weber         assert(chunks[i][0] == (uintptr_t)chunks[i]);
34*673dc3d4SNico Weber       if (i < to_replace) {
35*673dc3d4SNico Weber         delete [] chunks[i];
36*673dc3d4SNico Weber         chunks[i] = new uintptr_t[kAllocSize];
37*673dc3d4SNico Weber         chunks[i][0] = (uintptr_t)chunks[i];
38*673dc3d4SNico Weber       }
39*673dc3d4SNico Weber     }
40*673dc3d4SNico Weber   }
41*673dc3d4SNico Weber   for (auto p : chunks)
42*673dc3d4SNico Weber     delete[] p;
43*673dc3d4SNico Weber }
44*673dc3d4SNico Weber 
main(int argc,char ** argv)45*673dc3d4SNico Weber int main(int argc, char **argv) {
46*673dc3d4SNico Weber   MallocReleaseStress();
47*673dc3d4SNico Weber   if (argc > 1 && !strcmp("force", argv[1]))
48*673dc3d4SNico Weber     __sanitizer_purge_allocator();
49*673dc3d4SNico Weber   __asan_print_accumulated_stats();
50*673dc3d4SNico Weber }
51*673dc3d4SNico Weber 
52*673dc3d4SNico Weber // RELEASE: mapped:{{.*}}releases: {{[1-9]}}
53*673dc3d4SNico Weber // NO_RELEASE: mapped:{{.*}}releases: 0
54*673dc3d4SNico Weber // FORCE_RELEASE: mapped:{{.*}}releases: {{[1-9]}}
55