blob: 9024ed57668b89ce8c9b2d3402b037784265c123 [file] [log] [blame]
Jordan Rosee449edc2013-04-05 17:55:07 +00001// 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
Anton Yartsev8e452e72013-03-30 00:50:37 +00003#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 *);
Anton Yartsev8e452e72013-03-30 00:50:37 +00009
10//----------------------------------------------------------------------------
11// Check for intersections with unix.Malloc and unix.MallocWithAnnotations
12// checkers bounded with cplusplus.NewDelete.
13//----------------------------------------------------------------------------
14
Anton Yartsev6e227122013-04-05 00:37:32 +000015//----- malloc()/free() are subjects of unix.Malloc and unix.MallocWithAnnotations
Anton Yartsev8e452e72013-03-30 00:50:37 +000016void 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
Anton Yartsev6e227122013-04-05 00:37:32 +000028
29 int *p4 = (int *)malloc(sizeof(int));
30 free(p4);
31 int j = *p4; // no warn
Anton Yartsev8e452e72013-03-30 00:50:37 +000032}
33
Anton Yartsev70be6d82013-03-30 01:22:45 +000034void testDeleteMalloced() {
35 int *p = (int *)malloc(sizeof(int));
36 delete p; // no warn
37}
38
Anton Yartsev8e452e72013-03-30 00:50:37 +000039//----- Test free standard new
40void testFreeOpNew() {
41 void *p = operator new(0);
42 free(p);
Jordan Rosee85deb32013-04-05 17:55:00 +000043}
44#ifdef LEAKS
Anna Zaks68eb4c22013-04-06 00:41:36 +000045// expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
Jordan Rosee85deb32013-04-05 17:55:00 +000046#endif
Anton Yartsev8e452e72013-03-30 00:50:37 +000047
48void testFreeNewExpr() {
49 int *p = new int;
50 free(p);
Jordan Rosee85deb32013-04-05 17:55:00 +000051}
52#ifdef LEAKS
Anna Zaks68eb4c22013-04-06 00:41:36 +000053// expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
Jordan Rosee85deb32013-04-05 17:55:00 +000054#endif
Anton Yartsev8e452e72013-03-30 00:50:37 +000055
56void testObjcFreeNewed() {
57 int *p = new int;
Jordan Rosee85deb32013-04-05 17:55:00 +000058 NSData *nsdata = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1];
59#ifdef LEAKS
Anna Zaks68eb4c22013-04-06 00:41:36 +000060 // expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
Jordan Rosee85deb32013-04-05 17:55:00 +000061#endif
Anton Yartsev8e452e72013-03-30 00:50:37 +000062}
Anton Yartsev8e452e72013-03-30 00:50:37 +000063
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}