blob: b3707858f00ca331c0bb0760958107d764b9030f [file] [log] [blame]
Dominic Chen184c6242017-03-03 18:02:02 +00001// RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDelete -std=c++11 -fblocks -verify %s
2// RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDelete,cplusplus.NewDeleteLeaks -std=c++11 -DLEAKS -fblocks -verify %s
Artem Dergachevd3c54312018-01-24 21:24:10 +00003// RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDelete -std=c++11 -fblocks -DTEST_INLINABLE_ALLOCATORS -verify %s
4// RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDelete,cplusplus.NewDeleteLeaks -std=c++11 -DLEAKS -fblocks -DTEST_INLINABLE_ALLOCATORS -verify %s
Anton Yartsev3dfc33e2013-03-30 00:50:37 +00005#include "Inputs/system-header-simulator-cxx.h"
6#include "Inputs/system-header-simulator-objc.h"
7
8typedef __typeof__(sizeof(int)) size_t;
9extern "C" void *malloc(size_t);
Anton Yartsev5b5c7ce2015-02-19 13:36:20 +000010extern "C" void *alloca(size_t);
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000011extern "C" void free(void *);
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000012
13//----------------------------------------------------------------------------
14// Check for intersections with unix.Malloc and unix.MallocWithAnnotations
15// checkers bounded with cplusplus.NewDelete.
16//----------------------------------------------------------------------------
17
Anton Yartsev06dc8aa2013-04-05 00:37:32 +000018//----- malloc()/free() are subjects of unix.Malloc and unix.MallocWithAnnotations
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000019void testMallocFreeNoWarn() {
20 int i;
21 free(&i); // no warn
22
23 int *p1 = (int *)malloc(sizeof(int));
24 free(++p1); // no warn
25
26 int *p2 = (int *)malloc(sizeof(int));
27 free(p2);
28 free(p2); // no warn
29
30 int *p3 = (int *)malloc(sizeof(int)); // no warn
Anton Yartsev06dc8aa2013-04-05 00:37:32 +000031
32 int *p4 = (int *)malloc(sizeof(int));
33 free(p4);
34 int j = *p4; // no warn
Anton Yartsev5b5c7ce2015-02-19 13:36:20 +000035
36 int *p5 = (int *)alloca(sizeof(int));
37 free(p5); // no warn
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000038}
39
Anton Yartsevae3630b2013-03-30 01:22:45 +000040void testDeleteMalloced() {
Anton Yartsev5b5c7ce2015-02-19 13:36:20 +000041 int *p1 = (int *)malloc(sizeof(int));
42 delete p1; // no warn
43
44 int *p2 = (int *)__builtin_alloca(sizeof(int));
45 delete p2; // no warn
Anton Yartsevae3630b2013-03-30 01:22:45 +000046}
47
Anton Yartsevb50f4ba2015-04-14 14:18:04 +000048void testUseZeroAllocatedMalloced() {
49 int *p1 = (int *)malloc(0);
50 *p1 = 1; // no warn
51}
52
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000053//----- Test free standard new
54void testFreeOpNew() {
55 void *p = operator new(0);
56 free(p);
Jordan Rose26330562013-04-05 17:55:00 +000057}
58#ifdef LEAKS
Anna Zaksa1de8562013-04-06 00:41:36 +000059// expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
Jordan Rose26330562013-04-05 17:55:00 +000060#endif
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000061
62void testFreeNewExpr() {
63 int *p = new int;
64 free(p);
Jordan Rose26330562013-04-05 17:55:00 +000065}
66#ifdef LEAKS
Anna Zaksa1de8562013-04-06 00:41:36 +000067// expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
Jordan Rose26330562013-04-05 17:55:00 +000068#endif
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000069
70void testObjcFreeNewed() {
71 int *p = new int;
Jordan Rose26330562013-04-05 17:55:00 +000072 NSData *nsdata = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1];
73#ifdef LEAKS
Anna Zaksa1de8562013-04-06 00:41:36 +000074 // expected-warning@-2 {{Potential leak of memory pointed to by 'p'}}
Jordan Rose26330562013-04-05 17:55:00 +000075#endif
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000076}
Anton Yartsev3dfc33e2013-03-30 00:50:37 +000077
78void testFreeAfterDelete() {
79 int *p = new int;
80 delete p;
81 free(p); // expected-warning{{Use of memory after it is freed}}
82}
83
84void testStandardPlacementNewAfterDelete() {
85 int *p = new int;
86 delete p;
87 p = new(p) int; // expected-warning{{Use of memory after it is freed}}
88}