1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store=region -analyzer-max-loop 4 -verify %s 2 #include "system-header-simulator.h" 3 4 typedef __typeof(sizeof(int)) size_t; 5 void *malloc(size_t); 6 7 static int another_function(int *y) { 8 if (*y > 0) 9 return *y; 10 return 0; 11 } 12 13 static void function_which_doesnt_give_up(int **x) { 14 *x = 0; 15 } 16 17 static void function_which_gives_up(int *x) { 18 for (int i = 0; i < 5; ++i) 19 (*x)++; 20 } 21 22 static void function_which_gives_up_nested(int *x) { 23 function_which_gives_up(x); 24 for (int i = 0; i < 5; ++i) 25 (*x)++; 26 } 27 28 static void function_which_doesnt_give_up_nested(int *x, int *y) { 29 *y = another_function(x); 30 function_which_gives_up(x); 31 } 32 33 void coverage1(int *x) { 34 function_which_gives_up(x); 35 char *m = (char*)malloc(12); // expected-warning {{potential leak}} 36 } 37 38 void coverage2(int *x) { 39 if (x) { 40 function_which_gives_up(x); 41 char *m = (char*)malloc(12);// expected-warning {{potential leak}} 42 } 43 } 44 45 void coverage3(int *x) { 46 x++; 47 function_which_gives_up(x); 48 char *m = (char*)malloc(12);// expected-warning {{potential leak}} 49 } 50 51 void coverage4(int *x) { 52 *x += another_function(x); 53 function_which_gives_up(x); 54 char *m = (char*)malloc(12);// expected-warning {{potential leak}} 55 } 56 57 void coverage5(int *x) { 58 for (int i = 0; i<7; ++i) 59 function_which_gives_up(x); 60 // The root function gives up here. 61 char *m = (char*)malloc(12); // no-warning 62 } 63 64 void coverage6(int *x) { 65 for (int i = 0; i<3; ++i) { 66 function_which_gives_up(x); 67 } 68 char *m = (char*)malloc(12); // expected-warning {{potential leak}} 69 } 70 71 int coverage7_inline(int *i) { 72 function_which_doesnt_give_up(&i); 73 return *i; // expected-warning {{Dereference}} 74 } 75 76 void coverage8(int *x) { 77 int y; 78 function_which_doesnt_give_up_nested(x, &y); 79 y = (*x)/y; // expected-warning {{Division by zero}} 80 char *m = (char*)malloc(12); // expected-warning {{potential leak}} 81 } 82 83 void function_which_gives_up_settonull(int **x) { 84 *x = 0; 85 int y = 0; 86 for (int i = 0; i < 5; ++i) 87 y++; 88 } 89 90 void coverage9(int *x) { 91 int y = 5; 92 function_which_gives_up_settonull(&x); 93 y = (*x); // no warning 94 } 95