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 Webervoid 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 Weberint 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