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