xref: /llvm-project/compiler-rt/test/asan/TestCases/Posix/current_allocated_bytes.cpp (revision 4effda09d897c165253118dae8b7580d9d276048)
1673dc3d4SNico Weber // RUN: %clangxx_asan -O0 %s -pthread -o %t && %run %t
2673dc3d4SNico Weber // RUN: %clangxx_asan -O2 %s -pthread -o %t && %run %t
3673dc3d4SNico Weber // REQUIRES: stable-runtime
4673dc3d4SNico Weber 
5673dc3d4SNico Weber #include <assert.h>
6673dc3d4SNico Weber #include <pthread.h>
7673dc3d4SNico Weber #include <sanitizer/allocator_interface.h>
8673dc3d4SNico Weber #include <stdio.h>
9673dc3d4SNico Weber #include <stdlib.h>
10673dc3d4SNico Weber 
11673dc3d4SNico Weber const size_t kLargeAlloc = 1UL << 20;
12673dc3d4SNico Weber 
allocate(void * arg)13673dc3d4SNico Weber void* allocate(void *arg) {
14673dc3d4SNico Weber   volatile void *ptr = malloc(kLargeAlloc);
15673dc3d4SNico Weber   free((void*)ptr);
16673dc3d4SNico Weber   return 0;
17673dc3d4SNico Weber }
18673dc3d4SNico Weber 
check_stats(void * arg)19673dc3d4SNico Weber void* check_stats(void *arg) {
20*4effda09SChen Zheng   assert(__sanitizer_get_current_allocated_bytes() >= 0);
21673dc3d4SNico Weber   return 0;
22673dc3d4SNico Weber }
23673dc3d4SNico Weber 
main()24673dc3d4SNico Weber int main() {
25673dc3d4SNico Weber   size_t used_mem = __sanitizer_get_current_allocated_bytes();
26673dc3d4SNico Weber   printf("Before: %zu\n", used_mem);
27673dc3d4SNico Weber   const int kNumIterations = 1000;
28673dc3d4SNico Weber   for (int iter = 0; iter < kNumIterations; iter++) {
29673dc3d4SNico Weber     pthread_t thr[4];
30673dc3d4SNico Weber     for (int j = 0; j < 4; j++) {
31673dc3d4SNico Weber       assert(0 ==
32673dc3d4SNico Weber              pthread_create(&thr[j], 0, (j < 2) ? allocate : check_stats, 0));
33673dc3d4SNico Weber     }
34673dc3d4SNico Weber     for (int j = 0; j < 4; j++)
35673dc3d4SNico Weber       assert(0 == pthread_join(thr[j], 0));
36673dc3d4SNico Weber     used_mem = __sanitizer_get_current_allocated_bytes();
37673dc3d4SNico Weber     if (used_mem > kLargeAlloc) {
38673dc3d4SNico Weber       printf("After iteration %d: %zu\n", iter, used_mem);
39673dc3d4SNico Weber       return 1;
40673dc3d4SNico Weber     }
41673dc3d4SNico Weber   }
42673dc3d4SNico Weber   printf("Success after %d iterations\n", kNumIterations);
43673dc3d4SNico Weber   return 0;
44673dc3d4SNico Weber }
45