[analyzer] Don't generate a summary for "freeWhenDone" if method is
authorAnna Zaks <ganna@apple.com>
Tue, 11 Dec 2012 00:17:53 +0000 (00:17 +0000)
committerAnna Zaks <ganna@apple.com>
Tue, 11 Dec 2012 00:17:53 +0000 (00:17 +0000)
inlined.

Fixes a false positive that occurs if a user writes their own
initWithBytesNoCopy:freeWhenDone wrapper.

llvm-svn: 169795

clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
clang/test/Analysis/malloc.mm

index 6d48f02..26fd1c2 100644 (file)
@@ -499,6 +499,9 @@ static bool isFreeWhenDoneSetToZero(const ObjCMethodCall &Call) {
 
 void MallocChecker::checkPostObjCMessage(const ObjCMethodCall &Call,
                                          CheckerContext &C) const {
+  if (C.wasInlined)
+    return;
+
   // If the first selector is dataWithBytesNoCopy, assume that the memory will
   // be released with 'free' by the new object.
   // Ex:  [NSData dataWithBytesNoCopy:bytes length:10];
index c92c966..f2a195c 100644 (file)
@@ -5,6 +5,16 @@ typedef __typeof(sizeof(int)) size_t;
 void *malloc(size_t);
 void free(void *);
 
+@interface Wrapper : NSData
+- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len;
+@end
+
+@implementation Wrapper
+- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len {
+  return [self initWithBytesNoCopy:bytes length:len freeWhenDone:1]; // no-warning
+}
+@end
+
 // Done with headers. Start testing.
 void testNSDatafFreeWhenDoneNoError(NSUInteger dataLength) {
   unsigned char *data = (unsigned char *)malloc(42);
@@ -21,6 +31,11 @@ void testNSDataFreeWhenDoneYES2(NSUInteger dataLength) {
   NSData *nsdata = [[NSData alloc] initWithBytesNoCopy:data length:dataLength freeWhenDone:1]; // no-warning
 }
 
+void testNSDataFreeWhenDoneYES2_with_wrapper(NSUInteger dataLength) {
+  unsigned char *data = (unsigned char *)malloc(42);
+  Wrapper *nsdata = [[Wrapper alloc] initWithBytesNoCopy:data length:dataLength]; // no-warning
+}
+
 void testNSStringFreeWhenDoneYES3(NSUInteger dataLength) {
   unsigned char *data = (unsigned char *)malloc(42);
   NSString *nsstr = [[NSString alloc] initWithBytesNoCopy:data length:dataLength encoding:NSUTF8StringEncoding freeWhenDone:1];