|
1 |
| -// RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=core,unix.Malloc -analyzer-store=region -verify -fblocks %s |
| 1 | +// RUN: %clang_analyze_cc1 -std=c++14 \ |
| 2 | +// RUN: -analyzer-checker=core,unix.Malloc,cplusplus.NewDelete \ |
| 3 | +// RUN: -analyzer-checker=unix.MismatchedDeallocator \ |
| 4 | +// RUN: -verify -fblocks %s |
| 5 | + |
2 | 6 | #import "Inputs/system-header-simulator-objc.h"
|
3 | 7 | #import "Inputs/system-header-simulator-for-malloc.h"
|
4 | 8 |
|
@@ -61,6 +65,23 @@ void testNSStringFreeWhenDoneNO(NSUInteger dataLength) {
|
61 | 65 | NSString *nsstr = [[NSString alloc] initWithBytesNoCopy:data length:dataLength encoding:NSUTF8StringEncoding freeWhenDone:0]; // expected-warning{{leak}}
|
62 | 66 | }
|
63 | 67 |
|
| 68 | +void testNSStringFreeWhenDoneNewDelete(NSUInteger dataLength) { |
| 69 | + unsigned char *data = new unsigned char(42); |
| 70 | + NSData *nsdata = [[NSData alloc] initWithBytesNoCopy:data |
| 71 | + length:dataLength freeWhenDone:1]; |
| 72 | + // expected-warning@-2{{-initWithBytesNoCopy:length:freeWhenDone: cannot take ownership of memory allocated by 'new'}} |
| 73 | +} |
| 74 | + |
| 75 | +void testNSStringFreeWhenDoneNewDelete2(NSUInteger dataLength) { |
| 76 | + unsigned char *data = new unsigned char(42); |
| 77 | + NSData *nsdata = [[NSData alloc] initWithBytesNoCopy:data |
| 78 | + length:dataLength |
| 79 | + deallocator:^(void *bytes, |
| 80 | + NSUInteger length) { |
| 81 | + delete (unsigned char *)bytes; |
| 82 | + }]; // no-warning |
| 83 | +} |
| 84 | + |
64 | 85 | void testNSStringFreeWhenDoneNO2(NSUInteger dataLength) {
|
65 | 86 | unichar *data = (unichar*)malloc(42);
|
66 | 87 | NSString *nsstr = [[NSString alloc] initWithCharactersNoCopy:data length:dataLength freeWhenDone:0]; // expected-warning{{leak}}
|
|
0 commit comments