diff options
| author | Anna Zaks <ganna@apple.com> | 2012-06-22 02:04:31 +0000 |
|---|---|---|
| committer | Anna Zaks <ganna@apple.com> | 2012-06-22 02:04:31 +0000 |
| commit | 0d6989bd10cb66724fefa6c96aa70e4b82ff8740 (patch) | |
| tree | 7d9f65b1e3e811a8d9a43c516b1b4859904e5d7d /clang/test/Analysis | |
| parent | 33da33676fe3026fb8e1b237e845698bff42ffb0 (diff) | |
| download | bcm5719-llvm-0d6989bd10cb66724fefa6c96aa70e4b82ff8740.tar.gz bcm5719-llvm-0d6989bd10cb66724fefa6c96aa70e4b82ff8740.zip | |
[analyzer] Malloc: Warn about use-after-free when memory ownership was
transfered with dataWithBytesNoCopy.
llvm-svn: 158958
Diffstat (limited to 'clang/test/Analysis')
| -rw-r--r-- | clang/test/Analysis/malloc-annotations.c | 3 | ||||
| -rw-r--r-- | clang/test/Analysis/malloc.mm | 17 |
2 files changed, 12 insertions, 8 deletions
diff --git a/clang/test/Analysis/malloc-annotations.c b/clang/test/Analysis/malloc-annotations.c index 15ce62d9a5e..089e53132d9 100644 --- a/clang/test/Analysis/malloc-annotations.c +++ b/clang/test/Analysis/malloc-annotations.c @@ -124,11 +124,10 @@ void af2e() { } // This case inflicts a possible double-free. -// TODO: Better error message. void af3() { int *p = my_malloc(12); my_hold(p); - free(p); // expected-warning{{Attempt to free released memory}} + free(p); // expected-warning{{Attempt to free non-owned memory}} } int * af4() { diff --git a/clang/test/Analysis/malloc.mm b/clang/test/Analysis/malloc.mm index 855892da2bf..23297ec97cb 100644 --- a/clang/test/Analysis/malloc.mm +++ b/clang/test/Analysis/malloc.mm @@ -9,7 +9,6 @@ void free(void *); void testNSDatafFreeWhenDoneNoError(NSUInteger dataLength) { unsigned char *data = (unsigned char *)malloc(42); NSData *nsdata = [NSData dataWithBytesNoCopy:data length:dataLength]; - free(data); // no warning } void testNSDataFreeWhenDoneYES(NSUInteger dataLength) { @@ -55,11 +54,17 @@ void testNSStringFreeWhenDoneNO2(NSUInteger dataLength) { NSString *nsstr = [[NSString alloc] initWithCharactersNoCopy:data length:dataLength freeWhenDone:0]; // expected-warning{{leak}} } -// TODO: False Negative. -void testNSDatafFreeWhenDoneFN(NSUInteger dataLength) { - unsigned char *data = (unsigned char *)malloc(42); - NSData *nsdata = [NSData dataWithBytesNoCopy:data length:dataLength freeWhenDone:1]; - free(data); // false negative +void testRelinquished1() { + void *data = malloc(42); + NSData *nsdata = [NSData dataWithBytesNoCopy:data length:42 freeWhenDone:1]; + free(data); // expected-warning {{Attempt to free non-owned memory}} +} + +void testRelinquished2() { + void *data = malloc(42); + NSData *nsdata; + free(data); + [NSData dataWithBytesNoCopy:data length:42]; // expected-warning {{Attempt to free released memory}} } // Test CF/NS...NoCopy. PR12100: Pointers can escape when custom deallocators are provided. |

