1// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete -std=c++11 -fblocks -verify %s
2// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,alpha.cplusplus.NewDeleteLeaks -std=c++11 -DLEAKS -fblocks -verify %s
3#include "Inputs/system-header-simulator-cxx.h"
4#include "Inputs/system-header-simulator-objc.h"
5
6typedef __typeof__(sizeof(int)) size_t;
7extern "C" void *malloc(size_t);
8extern "C" void free(void *);
9
10//----------------------------------------------------------------------------
11// Check for intersections with unix.Malloc and unix.MallocWithAnnotations 
12// checkers bounded with cplusplus.NewDelete.
13//----------------------------------------------------------------------------
14
15//----- malloc()/free() are subjects of unix.Malloc and unix.MallocWithAnnotations
16void testMallocFreeNoWarn() {
17  int i;
18  free(&i); // no warn
19
20  int *p1 = (int *)malloc(sizeof(int));
21  free(++p1); // no warn
22
23  int *p2 = (int *)malloc(sizeof(int));
24  free(p2);
25  free(p2); // no warn
26
27  int *p3 = (int *)malloc(sizeof(int)); // no warn
28
29  int *p4 = (int *)malloc(sizeof(int));
30  free(p4);
31  int j = *p4; // no warn
32}
33
34void testDeleteMalloced() {
35  int *p = (int *)malloc(sizeof(int));
36  delete p; // no warn
37} 
38
39//----- Test free standard new
40void testFreeOpNew() {
41  void *p = operator new(0);
42  free(p);
43}
44#ifdef LEAKS
45// expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
46#endif
47
48void testFreeNewExpr() {
49  int *p = new int;
50  free(p);
51}
52#ifdef LEAKS
53// expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
54#endif
55
56void testObjcFreeNewed() {
57  int *p = new int;
58  NSData *nsdata = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1];
59#ifdef LEAKS
60  // expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
61#endif
62}
63
64void testFreeAfterDelete() {
65  int *p = new int;  
66  delete p;
67  free(p); // expected-warning{{Use of memory after it is freed}}
68}
69
70void testStandardPlacementNewAfterDelete() {
71  int *p = new int;  
72  delete p;
73  p = new(p) int; // expected-warning{{Use of memory after it is freed}}
74}
75