blob: 9e437d21827254dc3d6def082a07b979dbd0f67f [file] [log] [blame]
Anna Zaksb47dbcb2012-03-28 19:59:16 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store=region -analyzer-max-loop 4 -verify %s
Chandler Carruth1b22cec2012-09-12 01:11:10 +00002#include "Inputs/system-header-simulator.h"
Anna Zaks5903a372012-03-27 20:02:53 +00003
4typedef __typeof(sizeof(int)) size_t;
5void *malloc(size_t);
6
7static int another_function(int *y) {
8 if (*y > 0)
9 return *y;
10 return 0;
11}
12
13static void function_which_doesnt_give_up(int **x) {
14 *x = 0;
15}
16
17static void function_which_gives_up(int *x) {
18 for (int i = 0; i < 5; ++i)
19 (*x)++;
20}
21
22static 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
28static void function_which_doesnt_give_up_nested(int *x, int *y) {
29 *y = another_function(x);
30 function_which_gives_up(x);
31}
32
33void coverage1(int *x) {
34 function_which_gives_up(x);
Jordan Rose63bc1862012-11-15 19:11:43 +000035 char *m = (char*)malloc(12);
Anna Zaks68eb4c22013-04-06 00:41:36 +000036} // expected-warning {{Potential leak of memory pointed to by 'm'}}
Anna Zaks5903a372012-03-27 20:02:53 +000037
38void coverage2(int *x) {
39 if (x) {
40 function_which_gives_up(x);
Jordan Rose63bc1862012-11-15 19:11:43 +000041 char *m = (char*)malloc(12);
Anna Zaks5903a372012-03-27 20:02:53 +000042 }
Anna Zaks68eb4c22013-04-06 00:41:36 +000043} // expected-warning {{Potential leak of memory pointed to by 'm'}}
Anna Zaks5903a372012-03-27 20:02:53 +000044
45void coverage3(int *x) {
46 x++;
47 function_which_gives_up(x);
Jordan Rose63bc1862012-11-15 19:11:43 +000048 char *m = (char*)malloc(12);
Anna Zaks68eb4c22013-04-06 00:41:36 +000049} // expected-warning {{Potential leak of memory pointed to by 'm'}}
Anna Zaks5903a372012-03-27 20:02:53 +000050
51void coverage4(int *x) {
52 *x += another_function(x);
53 function_which_gives_up(x);
Jordan Rose63bc1862012-11-15 19:11:43 +000054 char *m = (char*)malloc(12);
Anna Zaks68eb4c22013-04-06 00:41:36 +000055} // expected-warning {{Potential leak of memory pointed to by 'm'}}
Anna Zaks5903a372012-03-27 20:02:53 +000056
57void 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
64void coverage6(int *x) {
65 for (int i = 0; i<3; ++i) {
66 function_which_gives_up(x);
67 }
Jordan Rose63bc1862012-11-15 19:11:43 +000068 char *m = (char*)malloc(12);
Anna Zaks68eb4c22013-04-06 00:41:36 +000069} // expected-warning {{Potential leak of memory pointed to by 'm'}}
Anna Zaks5903a372012-03-27 20:02:53 +000070
71int coverage7_inline(int *i) {
72 function_which_doesnt_give_up(&i);
73 return *i; // expected-warning {{Dereference}}
74}
75
76void coverage8(int *x) {
77 int y;
78 function_which_doesnt_give_up_nested(x, &y);
79 y = (*x)/y; // expected-warning {{Division by zero}}
Jordan Rose63bc1862012-11-15 19:11:43 +000080 char *m = (char*)malloc(12);
Anna Zaks68eb4c22013-04-06 00:41:36 +000081} // expected-warning {{Potential leak of memory pointed to by 'm'}}
Anna Zaks5903a372012-03-27 20:02:53 +000082
83void 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
90void coverage9(int *x) {
91 int y = 5;
92 function_which_gives_up_settonull(&x);
93 y = (*x); // no warning
94}
Anna Zaks144e52b2012-06-01 23:48:40 +000095
96static void empty_function(){
97}
98int use_empty_function(int x) {
99 x = 0;
100 empty_function();
101 return 5/x; //expected-warning {{Division by zero}}
102}