1 | // C, C++ |
---|---|
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 | void __attribute((ownership_takes(malloc, 1))) *user_free(void *); |
10 | |
11 | void __attribute((ownership_returns(malloc1))) *user_malloc1(size_t); |
12 | void __attribute((ownership_takes(malloc1, 1))) *user_free1(void *); |
13 | |
14 | void test() { |
15 | int *p = (int *)user_malloc(sizeof(int)); |
16 | delete p; // warn |
17 | } |
18 | |
19 | // C, C++ |
20 | void test() { |
21 | int *p = new int; |
22 | free(p); // warn |
23 | } |
24 | |
25 | // C, C++ |
26 | void test() { |
27 | int *p = new int[1]; |
28 | realloc(p, sizeof(long)); // warn |
29 | } |
30 | |
31 | // C, C++ |
32 | void test() { |
33 | int *p = user_malloc(10); |
34 | user_free1(p); // warn |
35 | } |
36 | |
37 | // C, C++ |
38 | template <typename T> |
39 | struct SimpleSmartPointer { |
40 | T *ptr; |
41 | |
42 | explicit SimpleSmartPointer(T *p = 0) : ptr(p) {} |
43 | ~SimpleSmartPointer() { |
44 | delete ptr; // warn |
45 | } |
46 | }; |
47 | |
48 | void test() { |
49 | SimpleSmartPointer<int> a((int *)malloc(4)); |
50 | } |
51 | |
52 | // C++ |
53 | void test() { |
54 | int *p = (int *)operator new(0); |
55 | delete[] p; // warn |
56 | } |
57 | |
58 | // Objective-C, C++ |
59 | void test(NSUInteger dataLength) { |
60 | int *p = new int; |
61 | NSData *d = [NSData dataWithBytesNoCopy:p |
62 | length:sizeof(int) freeWhenDone:1]; |
63 | // warn +dataWithBytesNoCopy:length:freeWhenDone: cannot take |
64 | // ownership of memory allocated by 'new' |
65 | } |
66 | |
67 |