112292c8bSVitaly Buka // Test for LeakSanitizer+AddressSanitizer of different sizes.
212292c8bSVitaly Buka // REQUIRES: leak-detection
312292c8bSVitaly Buka //
412292c8bSVitaly Buka // RUN: %clangxx_asan -O0 %s -o %t
512292c8bSVitaly Buka // RUN: not %run %t 0 2>&1 | FileCheck %s
612292c8bSVitaly Buka // RUN: not %run %t 1 2>&1 | FileCheck %s
712292c8bSVitaly Buka // RUN: not %run %t 1000 2>&1 | FileCheck %s
812292c8bSVitaly Buka // RUN: not %run %t 1000000 2>&1 | FileCheck %s
912292c8bSVitaly Buka // RUN: not %run %t 10000000 2>&1 | FileCheck %s
1012292c8bSVitaly Buka 
1112292c8bSVitaly Buka #include <cstdlib>
1212292c8bSVitaly Buka #include <stdio.h>
1312292c8bSVitaly Buka #include <thread>
1412292c8bSVitaly Buka int *t;
1512292c8bSVitaly Buka 
leak(int n)1612292c8bSVitaly Buka __attribute__((noopt)) void leak(int n) {
17*5cb378faSVy Nguyen #if defined(__ANDROID__) || defined(__BIONIC__)
18*5cb378faSVy Nguyen   // Bionic does not acutally allocate when n==0, hence
19*5cb378faSVy Nguyen   // there would not be a leak.
20*5cb378faSVy Nguyen   // Re-adjust n so the test can pass.
21*5cb378faSVy Nguyen   if (n == 0)
22*5cb378faSVy Nguyen     n = 1;
23*5cb378faSVy Nguyen #endif
24*5cb378faSVy Nguyen 
2512292c8bSVitaly Buka   // Repeat few times to make sure that at least one pointer is
2612292c8bSVitaly Buka   // not somewhere on the stack.
2712292c8bSVitaly Buka   for (int i = 0; i < 10; ++i) {
2812292c8bSVitaly Buka     t = new int[n];
2912292c8bSVitaly Buka     printf("t: %p\n", t);
3012292c8bSVitaly Buka     t = 0;
3112292c8bSVitaly Buka   }
3212292c8bSVitaly Buka }
3312292c8bSVitaly Buka 
main(int argc,char ** argv)3412292c8bSVitaly Buka int main(int argc, char **argv) {
3512292c8bSVitaly Buka   leak(atoi(argv[1]));
3612292c8bSVitaly Buka }
3712292c8bSVitaly Buka // CHECK: LeakSanitizer: detected memory leaks
38