xref: /openbsd-src/gnu/llvm/clang/docs/analyzer/checkers/mismatched_deallocator_example.cpp (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1 // C, C++
test()2 void test() {
3   int *p = (int *)malloc(sizeof(int));
4   delete p; // warn
5 }
6 
7 // C, C++
8 void __attribute((ownership_returns(malloc))) *user_malloc(size_t);
9 
test()10 void test() {
11   int *p = (int *)user_malloc(sizeof(int));
12   delete p; // warn
13 }
14 
15 // C, C++
test()16 void test() {
17   int *p = new int;
18   free(p); // warn
19 }
20 
21 // C, C++
test()22 void test() {
23   int *p = new int[1];
24   realloc(p, sizeof(long)); // warn
25 }
26 
27 // C, C++
28 template <typename T>
29 struct SimpleSmartPointer {
30   T *ptr;
31 
SimpleSmartPointerSimpleSmartPointer32   explicit SimpleSmartPointer(T *p = 0) : ptr(p) {}
~SimpleSmartPointerSimpleSmartPointer33   ~SimpleSmartPointer() {
34     delete ptr; // warn
35   }
36 };
37 
test()38 void test() {
39   SimpleSmartPointer<int> a((int *)malloc(4));
40 }
41 
42 // C++
test()43 void test() {
44   int *p = (int *)operator new(0);
45   delete[] p; // warn
46 }
47 
48 // Objective-C, C++
test(NSUInteger dataLength)49 void test(NSUInteger dataLength) {
50   int *p = new int;
51   NSData *d = [NSData dataWithBytesNoCopy:p
52                length:sizeof(int) freeWhenDone:1];
53     // warn +dataWithBytesNoCopy:length:freeWhenDone: cannot take
54     // ownership of memory allocated by 'new'
55 }
56 
57