blob: 8ae6024d7e0cd32de41608f6d621ed5c9550dc6c [file] [log] [blame]
Anna Zaksa19581a2012-02-20 22:25:23 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=unix.Malloc -analyzer-inline-call -analyzer-store=region -verify %s
2
3#include "system-header-simulator.h"
4
5typedef __typeof(sizeof(int)) size_t;
6void *malloc(size_t);
7void *valloc(size_t);
8void free(void *);
9void *realloc(void *ptr, size_t size);
10void *reallocf(void *ptr, size_t size);
11void *calloc(size_t nmemb, size_t size);
12extern void exit(int) __attribute__ ((__noreturn__));
13
14static void my_malloc1(void **d, size_t size) {
15 *d = malloc(size);
16}
17
18static void *my_malloc2(int elevel, size_t size) {
19 void *data;
20 data = malloc(size);
21 if (data == 0)
22 exit(0);
23 return data;
24}
25
26static void my_free1(void *p) {
27 free(p);
28}
29
30static void test1() {
31 void *data = 0;
32 my_malloc1(&data, 4); // expected-warning {{Memory is never released; potential memory leak}}
33}
34
35static void test2() {
36 void * data = my_malloc2(1, 4);
37 data = my_malloc2(1, 4);// expected-warning {{Memory is never released; potential memory leak}}
38}
39
40static void test3() {
41 void *data = my_malloc2(1, 4);
42 free(data);
43 data = my_malloc2(1, 4);
44 free(data);
45}
46
47int test4() {
48 int *data = (int*)my_malloc2(1, 4);
49 my_free1(data);
50 data = (int *)my_malloc2(1, 4);
51 my_free1(data);
52 return *data; // expected-warning {{Use of memory after it is freed}}
53}
54