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